aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java20
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java197
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java112
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java126
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java325
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java211
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java29
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java39
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java19
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java23
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java39
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java39
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java25
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java35
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java31
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java61
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java17
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java76
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java92
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java91
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java34
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java45
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java54
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java84
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java82
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java113
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java227
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java35
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java239
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java53
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java127
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java32
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java31
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java31
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java90
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java112
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java137
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java56
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java159
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java111
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java333
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java92
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java135
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java188
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java180
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java204
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java44
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java164
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java93
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java72
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java39
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java37
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java62
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java38
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java46
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java334
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java98
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java79
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java165
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java238
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java90
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java185
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java143
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java41
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java154
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java35
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java78
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java199
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java128
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java104
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java107
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java23
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java194
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java213
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java146
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java147
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java453
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java62
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java224
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java60
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java35
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java583
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java294
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java85
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java41
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java144
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java84
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java29
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java462
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java152
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java45
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java11
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java27
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java103
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java77
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java28
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java65
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java98
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java24
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java162
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java88
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java60
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java108
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java71
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java99
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java61
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java24
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java42
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java126
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java374
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java163
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java42
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java836
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java641
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java338
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java550
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java614
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java598
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java365
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java413
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java641
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java428
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java267
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java449
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java223
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java459
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java256
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java157
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java412
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java62
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java136
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java87
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java42
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java46
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java499
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java157
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java71
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java72
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java250
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java97
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java95
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java194
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java107
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java121
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java51
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java51
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java144
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java116
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java128
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java73
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java131
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java272
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java134
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java76
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java50
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java65
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java161
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java39
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java396
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java76
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java368
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java266
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java213
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java145
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java1158
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java1265
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java2092
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java96
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java671
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java48
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java77
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java21
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java58
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java74
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java78
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java332
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java296
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java282
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java529
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java296
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java66
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java377
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java69
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java62
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java62
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java250
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java602
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java42
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java173
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java40
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java43
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java95
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java273
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java140
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java213
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java220
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java49
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java502
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java210
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java220
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java57
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java803
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java253
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java51
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java173
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java51
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java31
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java42
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java187
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java146
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java79
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java50
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java116
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java309
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java172
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java396
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java56
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java51
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java81
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java187
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java82
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java38
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java392
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java163
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java72
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java146
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java65
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java19
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java98
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java285
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java104
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java304
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java115
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java316
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java96
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java34
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java78
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java121
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java38
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java37
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java37
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java186
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java25
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java155
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java108
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java113
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java92
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java97
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java203
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java93
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java121
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java156
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java177
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java98
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java82
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java163
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java82
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java84
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java118
-rw-r--r--src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java166
-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/bartworks/lang/de_DE.lang152
-rw-r--r--src/main/resources/assets/bartworks/lang/en_US.lang202
-rw-r--r--src/main/resources/assets/bartworks/lang/fr_FR.lang160
-rw-r--r--src/main/resources/assets/bartworks/lang/zh_CN.lang163
-rw-r--r--src/main/resources/assets/bartworks/sounds.json11
-rw-r--r--src/main/resources/assets/bartworks/sounds/radhatch.oggbin236744 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.pngbin812 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/background/brown.pngbin438 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.pngbin994 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.pngbin684 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.pngbin714 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.pngbin169 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.pngbin202 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.pngbin170 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.pngbin196 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.pngbin261 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.pngbin215 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.pngbin240 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.pngbin146 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/radiation.pngbin243 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.pngbin156 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.pngbin133 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.pngbin230 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.pngbin132 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.pngbin435 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.pngbin1002 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.pngbin236 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.pngbin249 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.pngbin145 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/slot/brown.pngbin109 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.pngbin130 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.pngbin154 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.pngbin150 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.pngbin559 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.pngbin177 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.pngbin187 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.pngbin185 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.pngbin187 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.pngbin188 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.pngbin187 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.pngbin187 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.pngbin129 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.pngbin471 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.pngbin835 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.pngbin336 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.pngbin196 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.pngbin666 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.pngbin680 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.pngbin680 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.pngbin682 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.pngbin795 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.pngbin199 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.pngbin126 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.pngbin382 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.pngbin623 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.pngbin130 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.pngbin227 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.pngbin665 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.pngbin125 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.pngbin207 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.pngbin228 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.pngbin227 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.pngbin207 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.pngbin205 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.pngbin207 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.pngbin203 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.pngbin208 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.pngbin209 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.pngbin207 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.pngbin206 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.pngbin202 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.pngbin227 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.pngbin226 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.pngbin186 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.pngbin182 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.pngbin188 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.pngbin183 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.pngbin177 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.pngbin182 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.pngbin187 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.pngbin180 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.pngbin186 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.pngbin184 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.pngbin473 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.pngbin549 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.pngbin473 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/windmill_top.pngbin591 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/Agarose.pngbin259 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BISOPelletBall.pngbin305 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.pngbin269 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.pngbin448 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BWmotor.pngbin506 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BWrawtube.pngbin450 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.pngbin258 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.pngbin291 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.pngbin253 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.pngbin481 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.pngbin525 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/DNASampleFlask.pngbin775 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/DetergentPowder.pngbin261 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/GT2Coin.pngbin259 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.pngbin353 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.pngbin362 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.pngbin5702 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.pngbin5691 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.pngbin5716 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.pngbin6022 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.pngbin5971 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.pngbin6020 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.pngbin5726 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.pngbin5709 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.pngbin5725 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.pngbin6031 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.pngbin5964 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.pngbin6030 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.pngbin5973 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.pngbin5937 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.pngbin5988 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.pngbin5932 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.pngbin5885 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.pngbin5971 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.pngbin5658 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.pngbin5673 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.pngbin5703 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/IncubationModule.pngbin623 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.pngbin566 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.pngbin2522 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PlasmidCell.pngbin777 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.pngbin499 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TRISOPellet.pngbin257 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.pngbin305 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.pngbin244 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TransformationModule.pngbin529 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/WrapOverlay.pngbin496 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/completed_grindstone.pngbin932 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/grindstone_bottom.pngbin823 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/grindstone_top.pngbin822 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.pngbin284 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/petriDish.pngbin441 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.pngbin699 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.pngbin407 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.pngbin441 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.pngbin472 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.pngbin382 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.pngbin600 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/paperParts.pngbin510 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.pngbin2294 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.pngbin1295 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.pngbin583 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.pngbin1123 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/woolParts.pngbin601 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.pngbin934 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.pngbin1048 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.pngbin990 -> 0 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.pngbin1260 -> 0 bytes
-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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.pngbin139 -> 0 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/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.pngbin139 -> 0 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/materialicons/blockCasing.pngbin703 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat1
-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.Core_Reactor_Cell.pngbin443 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.pngbin437 -> 0 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.Double_Tiberiumcell.pngbin362 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.pngbin364 -> 0 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.Quad_Tiberiumcell.pngbin535 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.pngbin528 -> 0 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.Tiberiumcell.pngbin318 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.pngbin318 -> 0 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.bwMetaGeneratedItem0/0.pngbin566 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.pngbin298 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.pngbin337 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.pngbin367 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.pngbin433 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.pngbin401 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.pngbin859 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.pngbin443 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.pngbin232 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.pngbin222 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.pngbin344 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.pngbin347 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.pngbin331 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.pngbin331 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.pngbin378 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.pngbin308 -> 0 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/blockCasing.pngbin626 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.pngbin639 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.pngbin139 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.pngbin139 -> 0 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/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.pngbin211 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.pngbin135 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.pngbin168 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.pngbin308 -> 0 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/items/materialicons/bottle.pngbin214 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.pngbin267 -> 0 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat1
-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
13352 files changed, 288058 insertions, 45407 deletions
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java
deleted file mode 100644
index 68a88b39ce..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-public class API_ConfigValues {
-
- // One-Side-Only
- public static boolean debugLog = true;
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java
deleted file mode 100644
index 2eee530a70..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import static gregtech.api.enums.Mods.Gendustry;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import java.awt.Color;
-
-import net.minecraft.item.EnumRarity;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.BioDNA;
-import com.github.bartimaeusnek.bartworks.util.BioData;
-import com.github.bartimaeusnek.bartworks.util.BioPlasmid;
-
-import gregtech.api.enums.FluidState;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TierEU;
-import gregtech.api.fluid.GT_FluidFactory;
-import gregtech.api.util.GT_Utility;
-
-public final class BioObjectAdder {
-
- /**
- * @param color the color of the Culture
- * @param name the name of the Culture
- * @param plasmid the cultures plasmid, get it from createAndRegisterBioPlasmid
- * @param dna the cultures dna, get it from createAndRegisterBioDNA
- * @param breedable if the culture can be inserted into the BacterialVat
- * @param rarity visual
- * @return
- */
- public static BioCulture createAndRegisterBioCulture(Color color, String name, BioPlasmid plasmid, BioDNA dna,
- EnumRarity rarity, boolean breedable) {
- if (BioCulture.BIO_CULTURE_ARRAY_LIST.size() > 1)
- return BioCulture.createAndRegisterBioCulture(color, name, plasmid, dna, rarity, breedable);
- new Exception(
- "Too Early to register a BioCulture! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * rarity inherits from dna
- *
- * @param color the color of the Culture
- * @param name the name of the Culture
- * @param plasmid the cultures plasmid, get it from createAndRegisterBioPlasmid
- * @param dna the cultures dna, get it from createAndRegisterBioDNA
- * @param breedable if the culture can be inserted into the BacterialVat
- * @return
- */
- public static BioCulture createAndRegisterBioCulture(Color color, String name, BioPlasmid plasmid, BioDNA dna,
- boolean breedable) {
- if (BioCulture.BIO_CULTURE_ARRAY_LIST.size() > 1)
- return BioCulture.createAndRegisterBioCulture(color, name, plasmid, dna, breedable);
- new Exception(
- "Too Early to register a BioCulture! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * unspecific Biodata that can be converted into DNA and Plasmid with the propper methodes
- *
- * @param aName the name of the Biodata
- * @param rarity visual only
- * @param chance the chanche to extract this BioData
- * @param tier the tier of this BioData 0=HV, 1=EV etc.
- * @return
- */
- public static BioData createAndRegisterBioData(String aName, EnumRarity rarity, int chance, int tier) {
- if (BioData.BIO_DATA_ARRAY_LIST.size() > 1)
- return BioData.createAndRegisterBioData(aName, rarity, chance, tier);
- new Exception("Too Early to register a BioData! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * Default Constructor for HV Tier DNA with 75% extraction rate
- *
- * @param aName Name of the DNA String
- * @param rarity visual
- * @return
- */
- public static BioDNA createAndRegisterBioDNA(String aName, EnumRarity rarity) {
- if (BioData.BIO_DATA_ARRAY_LIST.size() > 1) return BioDNA.createAndRegisterBioDNA(aName, rarity);
- new Exception("Too Early to register a BioData! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * Default Constructor for HV Tier Plasmid with 75% extraction rate
- *
- * @param aName Name of the Plasmid
- * @param rarity visual
- * @return
- */
- public static BioPlasmid createAndRegisterBioPlasmid(String aName, EnumRarity rarity) {
- if (BioData.BIO_DATA_ARRAY_LIST.size() > 1) return BioPlasmid.createAndRegisterBioPlasmid(aName, rarity);
- new Exception("Too Early to register a BioData! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * @param aName Name of the DNA String
- * @param rarity visual
- * @param chance chanche of extracting
- * @param tier tier needed to extract 0=HV, 1=EV etc.
- * @return
- */
- public static BioDNA createAndRegisterBioDNA(String aName, EnumRarity rarity, int chance, int tier) {
- if (BioData.BIO_DATA_ARRAY_LIST.size() > 1) return BioDNA.createAndRegisterBioDNA(aName, rarity, chance, tier);
- new Exception("Too Early to register a BioData! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * @param aName Name of the Plasmid
- * @param rarity visual
- * @param chance chanche of extracting
- * @param tier tier needed to extract 0=HV, 1=EV etc.
- * @return
- */
- public static BioPlasmid createAndRegisterBioPlasmid(String aName, EnumRarity rarity, int chance, int tier) {
- if (BioData.BIO_DATA_ARRAY_LIST.size() > 1)
- return BioPlasmid.createAndRegisterBioPlasmid(aName, rarity, chance, tier);
- new Exception("Too Early to register a BioData! You MUST run this either after:bartworks OR in the init Phase!")
- .printStackTrace();
- return null;
- }
-
- /**
- * @param voltageTier (i.e. 6 for LuV, 7 for ZPM, only intresting for LuV+)
- * @return the propper Bacteria Tier (at least 0)
- */
- public static int getBacteriaTierFromVoltageTier(int voltageTier) {
- return Math.max(voltageTier - 6, 0);
- }
-
- /**
- * If you get NPE's related to BioCultures (most likely because of Load Order or creating BioCultures after the
- * postinit Phase) execute this.
- */
- public static void regenerateBioFluids() {
- FluidStack dnaFluid = Gendustry.isModLoaded() ? FluidRegistry.getFluidStack("liquiddna", 100)
- : Materials.Biomass.getFluid(100L);
- for (BioCulture B : BioCulture.BIO_CULTURE_ARRAY_LIST) {
- if (B.getFluidNotSet()) {
- B.setFluid(
- GT_FluidFactory.builder(
- B.getName()
- .replace(" ", "")
- .toLowerCase() + "fluid")
- .withTextureName("molten.autogenerated")
- .withColorRGBA(
- new short[] { (short) B.getColor()
- .getRed(),
- (short) B.getColor()
- .getBlue(),
- (short) B.getColor()
- .getGreen() })
- .withStateAndTemperature(FluidState.LIQUID, 300)
- .buildAndRegister()
- .asFluid());
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(10))
- .fluidInputs(new FluidStack(B.getFluid(), 1000))
- .fluidOutputs(dnaFluid)
- .duration(25 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(centrifugeRecipes);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java
deleted file mode 100644
index ba1308c427..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import java.util.Collection;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.BioDNA;
-import com.github.bartimaeusnek.bartworks.util.BioData;
-import com.github.bartimaeusnek.bartworks.util.BioPlasmid;
-
-public final class BioObjectGetter {
-
- public static BioCulture getBioCulture(String aName) {
- return BioCulture.getBioCulture(aName);
- }
-
- public static NBTTagCompound getNBTTagFromCulture(BioCulture bioCulture) {
- return BioCulture.getNBTTagFromCulture(bioCulture);
- }
-
- public static NBTTagCompound getNBTTagFromBioPlasmid(BioPlasmid bioPlasmid) {
- return BioObjectGetter.getNBTTagFromBioData(BioObjectGetter.convertBioPlasmidToData(bioPlasmid));
- }
-
- public static NBTTagCompound getNBTTagFromBioDNA(BioDNA bioDNA) {
- return BioObjectGetter.getNBTTagFromBioData(BioObjectGetter.convertBioDNAtoData(bioDNA));
- }
-
- public static NBTTagCompound getNBTTagFromBioData(BioData bioData) {
- return BioData.getNBTTagFromBioData(bioData);
- }
-
- public static BioDNA convertDataToDNA(BioData bioData) {
- return BioDNA.convertDataToDNA(bioData);
- }
-
- public static BioPlasmid convertDataToPlasmid(BioData bioData) {
- return BioPlasmid.convertDataToPlasmid(bioData);
- }
-
- public static BioData convertBioPlasmidToData(BioPlasmid bioPlasmid) {
- return BioData.convertBioPlasmidToBioData(bioPlasmid);
- }
-
- public static BioData convertDataToDNA(BioDNA bioData) {
- return BioData.convertBioDNAToBioData(bioData);
- }
-
- public static BioData convertBioDNAtoData(BioDNA bioDNA) {
- return BioData.convertBioDNAToBioData(bioDNA);
- }
-
- public static BioPlasmid convertBioDNAtoBioPlasmid(BioDNA bioDNA) {
- return BioObjectGetter.convertDataToPlasmid(BioObjectGetter.convertBioDNAtoData(bioDNA));
- }
-
- public static BioDNA convertBioPlasmidtoBioDNA(BioPlasmid bioPlasmid) {
- return BioObjectGetter.convertDataToDNA(BioObjectGetter.convertBioPlasmidToData(bioPlasmid));
- }
-
- // UNSAFE needs to be reworked!
-
- public static Collection<ItemStack> getAllPetriDishes() {
- return BioItemList.getAllPetriDishes();
- }
-
- public static Collection<ItemStack> getAllDNASampleFlasks() {
- return BioItemList.getAllDNASampleFlasks();
- }
-
- public static Collection<ItemStack> getAllPlasmidCells() {
- return BioItemList.getAllPlasmidCells();
- }
-
- public static ItemStack getDNASampleFlask(BioDNA dna) {
- return BioItemList.getDNASampleFlask(dna);
- }
-
- public static ItemStack getPetriDish(BioCulture culture) {
- return BioItemList.getPetriDish(culture);
- }
-
- public static ItemStack getPlasmidCell(BioPlasmid plasmid) {
- return BioItemList.getPlasmidCell(plasmid);
- }
-
- /**
- * 1 - DetergentPowder 2 - Agarose 3 - IncubationModule 4 - Plasma Membrane
- *
- * @param selection
- * @return the selected Item
- */
- public static ItemStack getOther(int selection) {
- return BioItemList.getOther(selection);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java
deleted file mode 100644
index 6ab854c308..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.util.BWRecipes;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-
-import gregtech.api.enums.Materials;
-
-public final class BioRecipeAdder {
-
- public static final int STANDART = 0;
- public static final int LOWGRAVITY = -100;
- public static final int CLEANROOM = -200;
-
- public static boolean addBioLabRecipe(ItemStack[] aInputs, ItemStack aOutput, ItemStack aSpecialItems,
- int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt,
- int aSpecialValue) {
- return BWRecipes.instance.addBioLabRecipe(
- aInputs,
- aOutput,
- aSpecialItems,
- aChances,
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- aSpecialValue);
- }
-
- /**
- * Adds a Incubation Recipe for the BioLab.
- *
- * @param aInput any item that will be added with a petri dish
- * @param aOutput must be a BioCulture
- * @param aChances
- * @param aFluidInputs
- * @param aDuration
- * @param aEUt use BW_Util.getMachineVoltageFromTier(tier) to get optimal EU/t
- * @param aSpecialValue 0 = STANDART, -100 = LowGravity, -200 = Cleanroom
- * @return if the recipe was added.
- */
- public static boolean addBioLabRecipeIncubation(ItemStack aInput, BioCulture aOutput, int[] aChances,
- FluidStack aFluidInputs, int aDuration, int aEUt, int aSpecialValue) {
- return BWRecipes.instance
- .addBioLabRecipeIncubation(aInput, aOutput, aChances, aFluidInputs, aDuration, aEUt, aSpecialValue);
- }
-
- /**
- * @param aInputs Item Inputs, DO NOT PUT INTEGRATED CIRCUITS IN HERE! THEY WILL GET ADDED AUTOMATICALLY!, can
- * be null
- * @param aCulture the bio culture
- * @param aFluidInputs may not be null
- * @param aFluidOutputs may not be null
- * @param aDuration
- * @param aEUt
- * @param Sv Manual Sv entry i.e. for custom items
- * @param glasTier the glass tier
- * @param aSpecialValue Space or Cleanroom, Not yet implemented
- * @param exactSv if the recipe needs EXACTLY the Sv or can use less...
- * @return
- */
- public static boolean addBacterialVatRecipe(ItemStack[] aInputs, @Nonnull BioCulture aCulture,
- @Nonnull FluidStack[] aFluidInputs, @Nonnull FluidStack[] aFluidOutputs, @Nonnegative int aDuration,
- @Nonnegative int aEUt, int Sv, @Nonnegative int glasTier, int aSpecialValue, boolean exactSv) {
- return BWRecipes.instance.addBacterialVatRecipe(
- aInputs,
- aCulture,
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- Sv,
- glasTier,
- aSpecialValue,
- exactSv);
- }
-
- /**
- * @param aInputs Item Inputs, DO NOT PUT INTEGRATED CIRCUITS IN HERE! THEY WILL GET ADDED AUTOMATICALLY!, can
- * be null
- * @param aCulture the bio culture
- * @param aFluidInputs may not be null
- * @param aFluidOutputs may not be null
- * @param aDuration
- * @param aEUt
- * @param material may be null. used for auto Sv calculation
- * @param glasTier the glass tier
- * @param aSpecialValue Space or Cleanroom, Not yet implemented
- * @param exactSv if the recipe needs EXACTLY the Sv or can use less...
- * @return
- */
- @Deprecated
- public static boolean addBacterialVatRecipe(ItemStack[] aInputs, @Nonnull BioCulture aCulture,
- @Nonnull FluidStack[] aFluidInputs, @Nonnull FluidStack[] aFluidOutputs, @Nonnegative int aDuration,
- @Nonnegative int aEUt, Materials material, @Nonnegative int glasTier, int aSpecialValue, boolean exactSv) {
- return BWRecipes.instance.addBacterialVatRecipe(
- aInputs,
- aCulture,
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- material,
- glasTier,
- aSpecialValue,
- exactSv);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java
deleted file mode 100644
index b53638a77a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import static cpw.mods.fml.common.registry.GameRegistry.findBlock;
-import static gregtech.api.enums.Mods.IndustrialCraft2;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Objects;
-
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-
-import net.minecraft.block.Block;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.BW_NonMeta_MaterialItems;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.util.GT_ModHandler;
-
-public final class BioVatLogicAdder {
-
- public static class RadioHatch {
-
- public static void runBasicItemIntegration() {
- giveItemStackRadioHatchAbilites(ItemList.ThoriumCell_1.get(1), Materials.Thorium, 3);
- giveItemStackRadioHatchAbilites(ItemList.ThoriumCell_2.get(1), Materials.Thorium, 6);
- giveItemStackRadioHatchAbilites(ItemList.ThoriumCell_4.get(1), Materials.Thorium, 12);
-
- giveItemStackRadioHatchAbilites(ItemList.NaquadahCell_1.get(1), Materials.Naquadah, 3);
- giveItemStackRadioHatchAbilites(ItemList.NaquadahCell_2.get(1), Materials.Naquadah, 6);
- giveItemStackRadioHatchAbilites(ItemList.NaquadahCell_4.get(1), Materials.Naquadah, 12);
-
- giveItemStackRadioHatchAbilites(ItemList.Moxcell_1.get(1), Materials.Plutonium, 3);
- giveItemStackRadioHatchAbilites(ItemList.Moxcell_2.get(1), Materials.Plutonium, 6);
- giveItemStackRadioHatchAbilites(ItemList.Moxcell_4.get(1), Materials.Plutonium, 12);
-
- giveItemStackRadioHatchAbilites(ItemList.Uraniumcell_1.get(1), Materials.Uranium, 3);
- giveItemStackRadioHatchAbilites(ItemList.Uraniumcell_2.get(1), Materials.Uranium, 6);
- giveItemStackRadioHatchAbilites(ItemList.Uraniumcell_4.get(1), Materials.Uranium, 12);
-
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.TiberiumCell_1.get(1),
- WerkstoffLoader.Tiberium.getBridgeMaterial(),
- 3);
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.TiberiumCell_2.get(1),
- WerkstoffLoader.Tiberium.getBridgeMaterial(),
- 6);
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.TiberiumCell_4.get(1),
- WerkstoffLoader.Tiberium.getBridgeMaterial(),
- 12);
-
- giveItemStackRadioHatchAbilites(BW_NonMeta_MaterialItems.TheCoreCell.get(1), Materials.Naquadah, 96);
-
- giveItemStackRadioHatchAbilites(ItemList.Depleted_Thorium_1.get(1), Materials.Thorium, 3, 10);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_Thorium_2.get(1), Materials.Thorium, 6, 10);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_Thorium_4.get(1), Materials.Thorium, 12, 10);
-
- giveItemStackRadioHatchAbilites(ItemList.Depleted_Naquadah_1.get(1), Materials.Naquadah, 3, 10);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_Naquadah_2.get(1), Materials.Naquadah, 6, 10);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_Naquadah_4.get(1), Materials.Naquadah, 12, 10);
-
- giveItemStackRadioHatchAbilites(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorMOXSimpledepleted", 1),
- Materials.Plutonium,
- 3,
- 10);
- giveItemStackRadioHatchAbilites(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorMOXDualdepleted", 1),
- Materials.Plutonium,
- 6,
- 10);
- giveItemStackRadioHatchAbilites(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorMOXQuaddepleted", 1),
- Materials.Plutonium,
- 12,
- 10);
-
- giveItemStackRadioHatchAbilites(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorUraniumSimpledepleted", 1),
- Materials.Uranium,
- 3,
- 10);
- giveItemStackRadioHatchAbilites(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorUraniumDualdepleted", 1),
- Materials.Uranium,
- 6,
- 10);
- giveItemStackRadioHatchAbilites(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorUraniumQuaddepleted", 1),
- Materials.Uranium,
- 12,
- 10);
-
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.Depleted_Tiberium_1.get(1),
- WerkstoffLoader.Tiberium.getBridgeMaterial(),
- 3,
- 10);
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.Depleted_Tiberium_2.get(1),
- WerkstoffLoader.Tiberium.getBridgeMaterial(),
- 6,
- 10);
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.Depleted_Tiberium_4.get(1),
- WerkstoffLoader.Tiberium.getBridgeMaterial(),
- 12,
- 10);
-
- giveItemStackRadioHatchAbilites(
- BW_NonMeta_MaterialItems.Depleted_TheCoreCell.get(1),
- Materials.Naquadah,
- 96,
- 10);
-
- giveItemStackRadioHatchAbilites(ItemList.MNqCell_1.get(1), Materials.Naquadria, 3);
- giveItemStackRadioHatchAbilites(ItemList.MNqCell_2.get(1), Materials.Naquadria, 6);
- giveItemStackRadioHatchAbilites(ItemList.MNqCell_4.get(1), Materials.Naquadria, 12);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_MNq_1.get(1), Materials.Naquadria, 3, 10);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_MNq_2.get(1), Materials.Naquadria, 6, 10);
- giveItemStackRadioHatchAbilites(ItemList.Depleted_MNq_4.get(1), Materials.Naquadria, 12, 10);
- }
-
- private static final HashSet<BioVatLogicAdder.MaterialSvPair> MaSv = new HashSet<>();
- private static final HashMap<ItemStack, Integer> IsSv = new HashMap<>();
- private static final HashMap<ItemStack, Integer> IsKg = new HashMap<>();
- private static final HashMap<ItemStack, short[]> IsColor = new HashMap<>();
-
- public static HashSet<BioVatLogicAdder.MaterialSvPair> getMaSv() {
- return RadioHatch.MaSv;
- }
-
- public static HashMap<ItemStack, Integer> getIsKg() {
- return IsKg;
- }
-
- public static HashMap<ItemStack, Integer> getIsSv() {
- return RadioHatch.IsSv;
- }
-
- public static HashMap<ItemStack, short[]> getIsColor() {
- return IsColor;
- }
-
- public static void setOverrideSvForMaterial(Materials m, int sv) {
- MaSv.add(new BioVatLogicAdder.MaterialSvPair(m, sv));
- }
-
- public static void giveItemStackRadioHatchAbilites(ItemStack stack, int sv) {
- IsSv.put(stack, sv);
- }
-
- public static void giveItemStackRadioHatchAbilites(ItemStack stack, Materials materials) {
- IsSv.put(stack, BW_Util.calculateSv(materials));
- }
-
- public static void giveItemStackRadioHatchAbilites(ItemStack stack, int sv, int kg) {
- IsSv.put(stack, sv);
- IsKg.put(stack, kg);
- }
-
- public static void giveItemStackRadioHatchAbilites(ItemStack stack, Materials materials, int kg) {
- giveItemStackRadioHatchAbilites(stack, BW_Util.calculateSv(materials), kg);
- IsColor.put(stack, materials.getRGBA());
- }
-
- public static void giveItemStackRadioHatchAbilites(ItemStack stack, Materials materials, int kg, int divider) {
- giveItemStackRadioHatchAbilites(stack, BW_Util.calculateSv(materials) / divider, kg);
- IsColor.put(stack, materials.getRGBA());
- }
-
- public static void giveItemStackRadioHatchAbilites(ItemStack stack, int sv, int kg, short[] color) {
- giveItemStackRadioHatchAbilites(stack, sv, kg);
- IsColor.put(stack, color);
- }
-
- public static int MaxSV = 150;
-
- public static int getMaxSv() {
- int ret = MaxSV;
- for (MaterialSvPair pair : RadioHatch.getMaSv()) {
- if (pair.getSievert() > ret) ret = pair.getSievert();
- }
- for (ItemStack is : RadioHatch.IsSv.keySet()) {
- if (RadioHatch.IsSv.get(is) > ret) ret = RadioHatch.IsSv.get(is);
- }
- return ret;
- }
- }
-
- public static class BioVatGlass {
-
- private static final HashMap<BlockMetaPair, Byte> glasses = new HashMap<>();
-
- /**
- * @param sModname The modid owning the block
- * @param sUnlocBlockName The name of the block itself
- * @param meta The meta of the block
- * @param tier the glasses Tier = Voltage tier (MIN 3)
- * @return if the block was found in the Block registry
- */
- public static boolean addCustomGlass(String sModname, String sUnlocBlockName, int meta, int tier) {
- Block block = findBlock(sModname, sUnlocBlockName);
- boolean ret = block != null;
- if (ret) BioVatGlass.glasses.put(new BlockMetaPair(block, (byte) meta), (byte) tier);
- else new IllegalArgumentException(
- "Block: " + sUnlocBlockName + " of the Mod: " + sModname + " was NOT found!").printStackTrace();
- block = null;
- return ret;
- }
-
- /**
- * @param block the block to add
- * @param meta the meta of the block (0-15)
- * @param tier the glasses Tier = Voltage tier (MIN 3)
- */
- public static void addCustomGlass(@Nonnull Block block, @Nonnegative int meta, @Nonnegative int tier) {
- BioVatGlass.glasses.put(new BlockMetaPair(block, (byte) meta), (byte) tier);
- }
-
- /**
- * @param block the block to add
- * @param tier the glasses Tier = Voltage tier (MIN 3)
- */
- public static void addCustomGlass(@Nonnull Block block, @Nonnegative int tier) {
- BioVatGlass.glasses.put(new BlockMetaPair(block, (byte) 0), (byte) tier);
- }
-
- /**
- * @param blockBytePair the block to add and its meta as a javafx.util Pair
- * @param tier the glasses Tier = Voltage tier (MIN 3)
- */
- public static void addCustomGlass(@Nonnull BlockMetaPair blockBytePair, @Nonnegative byte tier) {
- BioVatGlass.glasses.put(blockBytePair, tier);
- }
-
- public static HashMap<BlockMetaPair, Byte> getGlassMap() {
- return BioVatGlass.glasses;
- }
- }
-
- public static class MaterialSvPair {
-
- final Materials materials;
- final Integer sievert;
-
- public MaterialSvPair(Materials materials, Integer sievert) {
- this.materials = materials;
- this.sievert = sievert;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass()) return false;
- BioVatLogicAdder.MaterialSvPair that = (BioVatLogicAdder.MaterialSvPair) o;
- return Objects.equals(this.getMaterials(), that.getMaterials())
- && Objects.equals(this.getSievert(), that.getSievert());
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(this.getMaterials(), this.getSievert());
- }
-
- public Materials getMaterials() {
- return this.materials;
- }
-
- public Integer getSievert() {
- return this.sievert;
- }
- }
-
- public static class BlockMetaPair {
-
- final Block block;
- final Byte aByte;
-
- public BlockMetaPair(Block block, Byte aByte) {
- this.block = block;
- this.aByte = aByte;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass()) return false;
- BioVatLogicAdder.BlockMetaPair that = (BioVatLogicAdder.BlockMetaPair) o;
- return Objects.equals(this.getBlock(), that.getBlock()) && Objects.equals(this.getaByte(), that.getaByte());
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(this.getBlock(), this.getaByte());
- }
-
- public Block getBlock() {
- return this.block;
- }
-
- public Byte getaByte() {
- return this.aByte;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java
deleted file mode 100644
index eb4c2a0405..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API;
-
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAdder;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered;
-import static gregtech.api.enums.Mods.BartWorks;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.PriorityQueue;
-import java.util.function.BiConsumer;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import net.minecraft.block.Block;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Table;
-import com.gtnewhorizon.structurelib.structure.IStructureElement;
-
-import cpw.mods.fml.common.Loader;
-import cpw.mods.fml.common.LoaderState;
-import cpw.mods.fml.common.registry.GameRegistry;
-
-/**
- * API for bartworks borosilicate glass.
- * <p>
- * You might have noticed this API does not expose any Block instance, but only IStructureElements. This is in case we
- * add more glass blocks later, and we run out of meta id for only one block.
- * <p>
- * IStructureElements returned from this class <b>SHOULD NOT</b> have its methods called before post init, or else you
- * might end up with wrong autoplace hints.
- */
-public class BorosilicateGlass {
-
- private static Block block, block2;
- private static List<Pair<Block, Integer>> representatives;
- private static SetMultimap<Byte, Pair<Block, Integer>> allLevels;
- private static final Table<Block, Integer, Byte> allLevelsReverse = HashBasedTable.create();
-
- private static boolean isValidTier(int tier) {
- return tier > 0 && tier <= Byte.MAX_VALUE;
- }
-
- private static Block getGlassBlock() {
- if (block == null) {
- block = GameRegistry.findBlock(BartWorks.ID, "BW_GlasBlocks");
- }
- return block;
- }
-
- private static Block getGlassBlock2() {
- if (block2 == null) {
- block2 = GameRegistry.findBlock(BartWorks.ID, "BW_GlasBlocks2");
- }
- return block2;
- }
-
- private static void doRegister(byte level, Block block, int meta,
- SetMultimap<Byte, Pair<Block, Integer>> allLevels) {
- allLevels.put(level, Pair.of(block, meta));
- allLevelsReverse.put(block, meta, level);
- }
-
- private static SetMultimap<Byte, Pair<Block, Integer>> getAllLevels() {
- if (allLevels == null) {
- SetMultimap<Byte, Pair<Block, Integer>> ret = LinkedHashMultimap.create();
- Block block = getGlassBlock();
- doRegister((byte) 3, block, 0, ret);
- doRegister((byte) 4, block, 1, ret);
- doRegister((byte) 5, block, 12, ret);
- doRegister((byte) 5, block, 2, ret);
- doRegister((byte) 6, block, 3, ret);
- doRegister((byte) 7, block, 4, ret);
- doRegister((byte) 8, block, 5, ret);
- for (int i = 6; i < 12; i++) {
- doRegister((byte) 3, block, i, ret);
- }
- doRegister((byte) 9, block, 13, ret);
- doRegister((byte) 10, block, 14, ret);
- doRegister((byte) 11, block, 15, ret);
- block = getGlassBlock2();
- doRegister((byte) 12, block, 0, ret);
- allLevels = ret;
- }
- return allLevels;
- }
-
- private static List<Pair<Block, Integer>> getRepresentatives() {
- if (representatives == null) {
- SetMultimap<Byte, Pair<Block, Integer>> allLevels = getAllLevels();
- ArrayList<Pair<Block, Integer>> ret = new ArrayList<>();
- for (Byte level : new PriorityQueue<>(allLevels.keySet())) {
- ret.add(
- allLevels.get(level)
- .iterator()
- .next());
- }
- representatives = ret;
- }
- return representatives;
- }
-
- private static Byte checkWithinBound(byte val, byte lo, byte hi) {
- return val > hi || val < lo ? null : val;
- }
-
- /**
- * Register a new block as valid borosilicate glass with given tier (even if it doesn't contain boron at all)
- *
- * Does not support matching by more complex stuff like tile entity!
- *
- * Can only be called at INIT stage.
- */
- public static void registerGlass(Block block, int meta, byte tier) {
- if (Loader.instance()
- .hasReachedState(LoaderState.POSTINITIALIZATION)) throw new IllegalStateException("register too late!");
- if (!Loader.instance()
- .hasReachedState(LoaderState.INITIALIZATION)) throw new IllegalStateException("register too early!");
- if (!isValidTier(tier)) throw new IllegalArgumentException("not a valid tier: " + tier);
- doRegister(tier, block, meta, getAllLevels());
- }
-
- /**
- * Check if there is at least one type of boroglass in that tier.
- */
- public static boolean hasGlassInTier(int tier) {
- return getAllLevels().containsKey((byte) tier);
- }
-
- /**
- * Get a structure element for a certain tier of <b>borosilicate</b> glass. DOES NOT accept other glass like
- * reinforced glass, magic mirror, vanilla glass, etc. unless these glass are explicitly registered as a
- * borosilicate glass.
- * <p>
- * Use this if you just want boroglass here and doesn't care what tier it is.
- */
- public static <T> IStructureElement<T> ofBoroGlass(int tier) {
- if (!hasGlassInTier(tier)) throw new IllegalArgumentException();
- return lazy(t -> {
- Pair<Block, Integer> pair = getRepresentatives().get(tier - 3);
- return ofBlockAdder((t1, block1, meta) -> getTier(block1, meta) == tier, pair.getKey(), pair.getValue());
- });
- }
-
- /**
- * Get a structure element for any kind of <b>borosilicate</b> glass. DOES NOT accept other glass like reinforced
- * glass, magic mirror, vanilla glass, etc. unless these glass are explicitly registered as a borosilicate glass.
- * <p>
- * Use this if you just want boroglass here and doesn't care what tier it is.
- */
- public static <T> IStructureElement<T> ofBoroGlassAnyTier() {
- return lazy(t -> ofBlockAnyMeta(getGlassBlock()));
- }
-
- /**
- * Get a structure element for <b>borosilicate</b> glass. DOES NOT accept other glass like reinforced glass, magic
- * mirror, vanilla glass, etc. unless these glass are explicitly registered as a borosilicate glass.
- * <p>
- * This assumes you want all glass used to be of the same tier.
- * <p>
- * NOTE: This will accept the basic boron glass (HV tier) as well. You might not want this. Use the other overload
- * to filter this out.
- *
- * @param initialValue the value set before structure check started
- */
- public static <T> IStructureElement<T> ofBoroGlass(byte initialValue, BiConsumer<T, Byte> setter,
- Function<T, Byte> getter) {
- return lazy(
- t -> ofBlocksTiered(BorosilicateGlass::getTier, getRepresentatives(), initialValue, setter, getter));
- }
-
- /**
- * Get a structure element for <b>borosilicate</b> glass. DOES NOT accept other glass like reinforced glass, magic
- * mirror, vanilla glass, etc. unless these glass are explicitly registered as a borosilicate glass.
- *
- * @param initialValue the value set before structure check started
- * @param minTier minimal accepted tier. inclusive. must be greater than 0.
- * @param maxTier maximal accepted tier. inclusive.
- */
- public static <T> IStructureElement<T> ofBoroGlass(byte initialValue, byte minTier, byte maxTier,
- BiConsumer<T, Byte> setter, Function<T, Byte> getter) {
- if (minTier > maxTier || minTier < 0) throw new IllegalArgumentException();
- return lazy(
- t -> ofBlocksTiered(
- (block1, meta) -> checkWithinBound(getTier(block1, meta), minTier, maxTier),
- getRepresentatives().stream()
- .skip(Math.max(minTier - 3, 0))
- .limit(maxTier - minTier + 1)
- .collect(Collectors.toList()),
- initialValue,
- setter,
- getter));
- }
-
- /**
- * Get the tier of this <b>borosilicate</b> glass. DOES NOT consider other glass like reinforced glass, magic
- * mirror, vanilla glass, etc. unless these glass are explicitly registered as a borosilicate glass.
- *
- * @return glass tier, or -1 if is not a borosilicate glass
- */
- public static byte getTier(Block block, int meta) {
- Byte ret = allLevelsReverse.get(block, meta);
- return ret == null ? -1 : ret;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java
deleted file mode 100644
index 4a85029994..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-public interface INoiseGen {
-
- double getNoise(int x, int z);
-
- double[][] getNoiseForRegion(int xStart, int zStart, int xEnd, int zEnd);
-
- void setOctaves(int octaves);
-
- void setFrequency(double freq);
-
- void setSeed(long seed);
-
- void setAmplitude(double amplitude);
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java
deleted file mode 100644
index 9d2e2d7829..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import net.minecraft.item.ItemStack;
-
-public interface IRadMaterial {
-
- /**
- * @return the amount of Radiation (0-150, commonly, higher values are possible but not recommended!)
- */
- int getRadiationLevel(ItemStack aStack);
-
- /**
- * @return 1 for stick, 2 for long rods, 3 for fuel rods
- */
- byte getAmountOfMaterial(ItemStack aStack);
-
- /**
- * @return the color of the material for display purposes
- */
- short[] getColorForGUI(ItemStack aStack);
-
- /**
- * @return the name of the material for display purposes
- */
- String getNameForGUI(ItemStack aStack);
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java
deleted file mode 100644
index d74263115b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-public interface ITileAddsInformation {
-
- String[] getInfoData();
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java
deleted file mode 100644
index 1f75115752..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import net.minecraft.inventory.ISidedInventory;
-
-public interface ITileDropsContent extends ISidedInventory {
-
- default int[] getDropSlots() {
- return new int[] { 0 };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java
deleted file mode 100644
index 698c28fbf7..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.util.IIcon;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public interface ITileHasDifferentTextureSides {
-
- IIcon[] texture = new IIcon[7];
-
- @SideOnly(Side.CLIENT)
- default IIcon getTextureForSide(ForgeDirection side, int meta) {
- return texture[side.ordinal()];
- }
-
- @SideOnly(Side.CLIENT)
- default IIcon getTextureForSide(int side, int meta) {
- return this.getTextureForSide(ForgeDirection.values()[side], meta);
- }
-
- @SideOnly(Side.CLIENT)
- void registerBlockIcons(IIconRegister par1IconRegister);
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java
deleted file mode 100644
index 88ae5bf5c0..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import cpw.mods.fml.common.FMLCommonHandler;
-
-public class SideReference {
-
- public static class EffectiveSide {
-
- public static final boolean Server = FMLCommonHandler.instance()
- .getEffectiveSide()
- .isServer();
- public static final boolean Client = FMLCommonHandler.instance()
- .getEffectiveSide()
- .isClient();
- }
-
- public static class Side {
-
- public static final boolean Server = FMLCommonHandler.instance()
- .getSide()
- .isServer();
- public static final boolean Client = FMLCommonHandler.instance()
- .getSide()
- .isClient();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java
deleted file mode 100644
index b83ce7d128..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import com.github.bartimaeusnek.crossmod.galacticgreg.VoidMinerUtility;
-
-import gregtech.api.interfaces.ISubTagContainer;
-
-public class VoidMinerDropAdder {
-
- public static void addDropsToDim(int dimID, ISubTagContainer material, float chance) {
- VoidMinerUtility.addMaterialToDimensionList(dimID, material, chance);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java
deleted file mode 100644
index 01c172382f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-
-public final class WerkstoffAPI {
-
- @SuppressWarnings("rawtypes")
- static Class w;
-
- static {
- try {
- w = Class.forName("com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public static Werkstoff getWerkstoff(String aName) throws NoSuchFieldException, IllegalAccessException {
- return (Werkstoff) w.getField(aName)
- .get(null);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java
deleted file mode 100644
index 2cd29281f4..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.API;
-
-import java.util.HashSet;
-
-public final class WerkstoffAdderRegistry {
-
- private static final HashSet<Runnable> toRun = new HashSet<>();
-
- private WerkstoffAdderRegistry() {}
-
- public static void addWerkstoffAdder(Runnable adder) {
- toRun.add(adder);
- }
-
- public static void run() {
- for (Runnable r : toRun) r.run();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java
deleted file mode 100644
index 620e9d65af..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API.modularUI;
-
-import static com.github.bartimaeusnek.bartworks.MainMod.MOD_ID;
-
-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 BW_UITextures {
-
- public static final AdaptableUITexture BACKGROUND_BROWN = AdaptableUITexture
- .of(MOD_ID, "GUI/background/brown", 176, 166, 3);
- public static final UITexture BACKGROUND_CIRCUIT_PROGRAMMER = UITexture
- .fullImage(MOD_ID, "GUI/background/circuit_programmer");
-
- public static final AdaptableUITexture SLOT_BROWN = AdaptableUITexture.of(MOD_ID, "GUI/slot/brown", 18, 18, 1);
-
- public static final UITexture OVERLAY_SLOT_DISH = UITexture.fullImage(MOD_ID, "GUI/overlay_slot/dish");
- public static final UITexture OVERLAY_SLOT_DNA_FLASK = UITexture.fullImage(MOD_ID, "GUI/overlay_slot/dna_flask");
- public static final UITexture OVERLAY_SLOT_MODULE = UITexture.fullImage(MOD_ID, "GUI/overlay_slot/module");
- public static final UITexture OVERLAY_SLOT_ROD = UITexture.fullImage(MOD_ID, "GUI/overlay_slot/rod");
- public static final UITexture OVERLAY_SLOT_CROSS = UITexture.fullImage(MOD_ID, "GUI/overlay_slot/cross");
-
- public static final UITexture PROGRESSBAR_SIEVERT = UITexture.fullImage(MOD_ID, "GUI/progressbar/sievert");
- public static final UITexture PROGRESSBAR_STORED_EU_116 = UITexture
- .fullImage(MOD_ID, "GUI/progressbar/stored_eu_116");
- public static final UITexture PROGRESSBAR_FUEL = UITexture.fullImage(MOD_ID, "GUI/progressbar/fuel");
-
- public static final UITexture PICTURE_BW_LOGO_47X21 = UITexture.fullImage(MOD_ID, "GUI/picture/bw_logo_47x21");
- public static final UITexture PICTURE_SIEVERT_CONTAINER = UITexture
- .fullImage(MOD_ID, "GUI/picture/sievert_container");
- public static final UITexture PICTURE_DECAY_TIME_CONTAINER = UITexture
- .fullImage(MOD_ID, "GUI/picture/decay_time_container");
- public static final UITexture PICTURE_DECAY_TIME_INSIDE = UITexture
- .fullImage(MOD_ID, "GUI/picture/decay_time_inside");
- public static final UITexture PICTURE_RADIATION = UITexture.fullImage(MOD_ID, "GUI/picture/radiation");
- public static final UITexture PICTURE_WINDMILL_EMPTY = UITexture.fullImage(MOD_ID, "GUI/picture/windmill_empty");
- public static final UITexture[] PICTURE_WINDMILL_ROTATING = IntStream.range(0, 4)
- .mapToObj(i -> UITexture.partly(MOD_ID, "GUI/picture/windmill_rotating", 32, 128, 0, i * 32, 32, (i + 1) * 32))
- .collect(Collectors.toList())
- .toArray(new UITexture[0]);
- public static final UITexture PICTURE_STORED_EU_FRAME = UITexture.fullImage(MOD_ID, "GUI/picture/stored_eu_frame");
- public static final UITexture PICTURE_RADIATION_SHUTTER_FRAME = UITexture
- .fullImage(MOD_ID, "GUI/picture/radiation_shutter_frame");
- public static final AdaptableUITexture PICTURE_RADIATION_SHUTTER_INSIDE = AdaptableUITexture
- .of(MOD_ID, "GUI/picture/radiation_shutter_inside", 51, 48, 1);
-
- public static final AdaptableUITexture TAB_TITLE_BROWN = AdaptableUITexture
- .of(MOD_ID, "GUI/tab/title_brown", 28, 28, 4);
- public static final AdaptableUITexture TAB_TITLE_DARK_BROWN = AdaptableUITexture
- .of(MOD_ID, "GUI/tab/title_dark_brown", 28, 28, 4);
- public static final AdaptableUITexture TAB_TITLE_ANGULAR_BROWN = AdaptableUITexture
- .of(MOD_ID, "GUI/tab/title_angular_brown", 28, 28, 4);
-
- public static final UITexture OVERLAY_BUTTON_ASSEMBLER_MODE = UITexture
- .fullImage(MOD_ID, "GUI/overlay_button/assembler_mode");
- public static final UITexture OVERLAY_BUTTON_LINE_MODE = UITexture
- .fullImage(MOD_ID, "GUI/overlay_button/line_mode");
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java
deleted file mode 100644
index 4bef7a0cad..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-@API(owner = Mods.Names.BART_WORKS, apiVersion = API_REFERENCE.VERSION, provides = "bartworks API")
-package com.github.bartimaeusnek.bartworks.API;
-
-import cpw.mods.fml.common.API;
-import gregtech.api.enums.Mods;
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java
deleted file mode 100644
index dfcf94115a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API.recipe;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-import net.minecraft.inventory.InventoryCrafting;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.IRecipe;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-public class BWNBTDependantCraftingRecipe implements IRecipe {
-
- ItemStack result;
- Map<Character, ItemStack> charToStackMap = new HashMap<>(9, 1);
- String[] shape;
-
- @SuppressWarnings({ "SuspiciousSystemArraycopy" })
- public BWNBTDependantCraftingRecipe(ItemStack result, Object... recipe) {
- this.result = result;
- this.shape = new String[3];
- System.arraycopy(recipe, 0, this.shape, 0, 3);
- this.charToStackMap.put(' ', null);
- for (int i = 3; i < recipe.length; i += 2) {
- this.charToStackMap.put((char) recipe[i], ((ItemStack) recipe[i + 1]).copy());
- }
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof BWNBTDependantCraftingRecipe that)) return false;
-
- if (!Objects.equals(this.result, that.result) || !Objects.equals(this.charToStackMap, that.charToStackMap))
- return false;
- // Probably incorrect - comparing Object[] arrays with Arrays.equals
- return Arrays.equals(this.shape, that.shape);
- }
-
- @Override
- public int hashCode() {
- int result1 = this.result != null ? this.result.hashCode() : 0;
- result1 = 31 * result1 + (this.charToStackMap != null ? this.charToStackMap.hashCode() : 0);
- return 31 * result1 + Arrays.hashCode(this.shape);
- }
-
- @Override
- public boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_) {
- for (int x = 0; x < 3; x++) {
- for (int y = 0; y < 3; y++) {
- ItemStack toCheck = p_77569_1_.getStackInRowAndColumn(y, x);
- ItemStack ref = this.charToStackMap.get(this.shape[x].toCharArray()[y]);
- if (!BW_Util.areStacksEqualOrNull(toCheck, ref)) return false;
- }
- }
- return true;
- }
-
- @Override
- public ItemStack getCraftingResult(InventoryCrafting p_77572_1_) {
- return this.result.copy();
- }
-
- @Override
- public int getRecipeSize() {
- return 10;
- }
-
- @Override
- public ItemStack getRecipeOutput() {
- return this.result;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java
deleted file mode 100644
index 01cf2ecd32..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API.recipe;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.annotation.ParametersAreNonnullByDefault;
-
-import net.minecraft.util.EnumChatFormatting;
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_BioVat;
-import com.gtnewhorizons.modularui.api.math.Alignment;
-
-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 gregtech.nei.RecipeDisplayInfo;
-import gregtech.nei.formatter.INEISpecialInfoFormatter;
-
-@ParametersAreNonnullByDefault
-@MethodsReturnNonnullByDefault
-public class BacterialVatFrontend extends RecipeMapFrontend {
-
- public BacterialVatFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
- NEIRecipePropertiesBuilder neiPropertiesBuilder) {
- super(
- uiPropertiesBuilder,
- neiPropertiesBuilder.neiSpecialInfoFormatter(new BacterialVatSpecialValueFormatter()));
- }
-
- @Override
- protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
- GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
- if (pStack.isFluid()) {
- currentTip.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("nei.biovat.input.tooltip"));
- return currentTip;
- }
- return super.handleNEIItemInputTooltip(currentTip, pStack);
- }
-
- @Override
- protected List<String> handleNEIItemOutputTooltip(List<String> currentTip,
- GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
- if (pStack.isFluid()) {
- currentTip.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("nei.biovat.output.tooltip"));
- return currentTip;
- }
- return super.handleNEIItemOutputTooltip(currentTip, pStack);
- }
-
- @Override
- protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
- drawFluidOverlay(stack);
- }
-
- @Override
- protected void drawNEIOverlayForOutput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
- drawFluidOverlay(stack);
- }
-
- private void drawFluidOverlay(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
- if (stack.isFluid()) {
- drawNEIOverlayText(
- "+",
- stack,
- colorOverride.getTextColorOrDefault("nei_overlay_yellow", 0xFDD835),
- 0.5f,
- true,
- Alignment.TopRight);
- return;
- }
- super.drawNEIOverlayForOutput(stack);
- }
-
- private static class BacterialVatSpecialValueFormatter implements INEISpecialInfoFormatter {
-
- @Override
- public List<String> format(RecipeDisplayInfo recipeInfo) {
- int[] tSpecialA = GT_TileEntity_BioVat.specialValueUnpack(recipeInfo.recipe.mSpecialValue);
- String glassTier = StatCollector.translateToLocalFormatted("nei.biovat.0.name", tSpecialA[0]);
- String sievert;
- if (tSpecialA[2] == 1) {
- sievert = StatCollector.translateToLocalFormatted("nei.biovat.1.name", tSpecialA[3]);
- } else {
- sievert = StatCollector.translateToLocalFormatted("nei.biovat.2.name", tSpecialA[3]);
- }
- return Arrays.asList(glassTier, sievert);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java
deleted file mode 100644
index 281184893c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API.recipe;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-
-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.FuelBackend;
-import gregtech.nei.formatter.FuelSpecialValueFormatter;
-
-public class BartWorksRecipeMaps {
-
- public static final RecipeMap<RecipeMapBackend> bioLabRecipes = RecipeMapBuilder.of("bw.recipe.biolab")
- .maxIO(6, 2, 1, 0)
- .minInputs(1, 1)
- .useSpecialSlot()
- .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
- if (isSpecial) {
- return BW_UITextures.OVERLAY_SLOT_MODULE;
- }
- if (isFluid) {
- return GT_UITextures.OVERLAY_SLOT_VIAL_2;
- }
- if (!isOutput) {
- switch (index) {
- case 0:
- return BW_UITextures.OVERLAY_SLOT_DISH;
- case 1:
- return BW_UITextures.OVERLAY_SLOT_DNA_FLASK;
- case 2:
- return GT_UITextures.OVERLAY_SLOT_CIRCUIT;
- case 3:
- return GT_UITextures.OVERLAY_SLOT_MOLECULAR_1;
- case 4:
- return GT_UITextures.OVERLAY_SLOT_MOLECULAR_2;
- case 5:
- return GT_UITextures.OVERLAY_SLOT_DATA_ORB;
- }
- }
- return null;
- })
- .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
- .logo(BW_UITextures.PICTURE_BW_LOGO_47X21)
- .logoSize(47, 21)
- .logoPos(125, 3)
- .disableRegisterNEI()
- .build();
- public static final RecipeMap<RecipeMapBackend> bacterialVatRecipes = RecipeMapBuilder.of("bw.recipe.BacteriaVat")
- .maxIO(6, 2, 1, 1)
- .minInputs(0, 1)
- .useSpecialSlot()
- .specialSlotSensitive()
- .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
- .frontend(BacterialVatFrontend::new)
- .disableRegisterNEI()
- .build();
- public static final RecipeMap<FuelBackend> acidGenFuels = RecipeMapBuilder.of("bw.fuels.acidgens", FuelBackend::new)
- .maxIO(1, 1, 0, 0)
- .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
- .build();
- public static final RecipeMap<RecipeMapBackend> circuitAssemblyLineRecipes = RecipeMapBuilder.of("bw.recipe.cal")
- .maxIO(6, 1, 1, 0)
- .minInputs(1, 1)
- .useSpecialSlot()
- .specialSlotSensitive()
- .progressBar(GT_UITextures.PROGRESSBAR_CIRCUIT_ASSEMBLER)
- .build();
- public static final RecipeMap<RecipeMapBackend> radioHatchRecipes = RecipeMapBuilder.of("bw.recipe.radhatch")
- .maxIO(1, 0, 0, 0)
- .minInputs(1, 0)
- .slotOverlays((index, isFluid, isOutput, isSpecial) -> BW_UITextures.OVERLAY_SLOT_ROD)
- .logo(BW_UITextures.PICTURE_BW_LOGO_47X21)
- .logoSize(47, 21)
- .logoPos(118, 55)
- .dontUseProgressBar()
- .addSpecialTexture(74, 20, 29, 27, BW_UITextures.PICTURE_RADIATION)
- .frontend(RadioHatchFrontend::new)
- .build();
- public static final RecipeMap<RecipeMapBackend> electricImplosionCompressorRecipes = RecipeMapBuilder
- .of("gt.recipe.electricimplosioncompressor")
- .maxIO(6, 2, 1, 1)
- .slotOverlays(
- (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_IMPLOSION
- : null)
- .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS)
- .build();
- public static final RecipeMap<RecipeMapBackend> htgrFakeRecipes = RecipeMapBuilder.of("bw.recipe.htgr")
- .maxIO(1, 1, 0, 0)
- .build();
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java
deleted file mode 100644
index d409d3ab26..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API.recipe;
-
-import java.util.ArrayList;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-
-import gregtech.api.util.GT_Recipe;
-
-public class DynamicGTRecipe extends GT_Recipe {
-
- public DynamicGTRecipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems,
- int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt,
- int aSpecialValue, GT_Recipe originalRecipe) {
- super(
- aOptimize,
- aInputs,
- aOutputs,
- aSpecialItems,
- aChances,
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- aSpecialValue);
- if (originalRecipe != null) {
- this.owners = new ArrayList<>(originalRecipe.owners);
- this.stackTraces = new ArrayList<>(originalRecipe.stackTraces);
- this.setOwner(MainMod.MOD_ID);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java
deleted file mode 100644
index a6cf4b180e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.github.bartimaeusnek.bartworks.API.recipe;
-
-import java.util.Arrays;
-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.RecipeDisplayInfo;
-import gregtech.nei.formatter.INEISpecialInfoFormatter;
-
-@ParametersAreNonnullByDefault
-@MethodsReturnNonnullByDefault
-public class RadioHatchFrontend extends RecipeMapFrontend {
-
- public RadioHatchFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
- NEIRecipePropertiesBuilder neiPropertiesBuilder) {
- super(uiPropertiesBuilder, neiPropertiesBuilder.neiSpecialInfoFormatter(new RadioHatchSpecialInfoFormatter()));
- }
-
- @Override
- protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {}
-
- @Override
- protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
-
- private static class RadioHatchSpecialInfoFormatter implements INEISpecialInfoFormatter {
-
- @Override
- public List<String> format(RecipeDisplayInfo recipeInfo) {
- int radioLevel = recipeInfo.recipe.mEUt;
- int amount = recipeInfo.recipe.mDuration;
- long time = recipeInfo.recipe.mSpecialValue;
- return Arrays.asList(
- StatCollector.translateToLocalFormatted("BW.NEI.display.radhatch.0", radioLevel),
- StatCollector.translateToLocalFormatted("BW.NEI.display.radhatch.1", amount),
- StatCollector.translateToLocalFormatted("BW.NEI.display.radhatch.2", time * amount / 20.0));
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java
deleted file mode 100644
index 725a0135a4..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.ASM;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.objectweb.asm.tree.MethodNode;
-
-public class ASMUtils {
-
- public static String matchAny(String toCompare, String... args) {
- for (String arg : args) {
- if (toCompare.equalsIgnoreCase(arg)) return arg;
- }
- return "";
- }
-
- /**
- * Call this Method twice, one time for the Descriptor and one time for the Name.
- */
- public static boolean isCorrectMethod(MethodNode methodNode, String... args) {
- for (String arg : args) {
- if (methodNode.name.equalsIgnoreCase(arg) || methodNode.desc.equalsIgnoreCase(arg)) return true;
- }
- return false;
- }
-
- public static boolean writeClassToDisk(byte[] towrite, String Classname, String Path) {
- try {
- if (Path.charAt(Path.length() - 1) == '/' || Path.charAt(Path.length() - 1) == '\\')
- Path = Path.substring(0, Path.length() - 1);
- OutputStream os = new FileOutputStream(new File(Path + '/' + Classname + ".class"));
- os.write(towrite);
- } catch (IOException e) {
- e.printStackTrace();
- return false;
- }
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java
deleted file mode 100644
index 54598f9478..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.ASM;
-
-import static com.github.bartimaeusnek.bartworks.ASM.BWCoreTransformer.shouldTransform;
-import static gregtech.api.enums.Mods.ExtraUtilities;
-import static gregtech.api.enums.Mods.GTPlusPlus;
-import static gregtech.api.enums.Mods.RWG;
-import static gregtech.api.enums.Mods.Thaumcraft;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-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 cpw.mods.fml.common.versioning.ArtifactVersion;
-import cpw.mods.fml.common.versioning.DefaultArtifactVersion;
-
-public class BWCore extends DummyModContainer {
-
- public static final String BWCORE_NAME = "BartWorks ASM Core";
- public static final Logger BWCORE_LOG = LogManager.getLogger(BWCore.BWCORE_NAME);
-
- public BWCore() {
- super(new ModMetadata());
- ModMetadata metadata = this.getMetadata();
- metadata.modId = "BWCore";
- metadata.name = BWCore.BWCORE_NAME;
- metadata.version = "0.0.1";
- metadata.authorList.add("bartimaeusnek");
- metadata.dependants = this.getDependants();
- metadata.parent = MainMod.MOD_ID;
- }
-
- @Subscribe
- public void preInit(FMLPreInitializationEvent event) {
- shouldTransform[0] = ConfigHandler.enabledPatches[0];
- shouldTransform[1] = ConfigHandler.enabledPatches[1];
- shouldTransform[2] = ConfigHandler.enabledPatches[2];
- shouldTransform[3] = ConfigHandler.enabledPatches[3];
- BWCore.BWCORE_LOG.info("Extra Utilities found and ASM Patch enabled? " + shouldTransform[0]);
- BWCore.BWCORE_LOG.info("Thaumcraft found and ASM Patch enabled? " + shouldTransform[2]);
- }
-
- @Override
- public List<ArtifactVersion> getDependants() {
- List<ArtifactVersion> ret = new ArrayList<>();
- ret.add(new DefaultArtifactVersion(ExtraUtilities.ID, true));
- ret.add(new DefaultArtifactVersion(Thaumcraft.ID, true));
- ret.add(new DefaultArtifactVersion(GTPlusPlus.ID, true));
- ret.add(new DefaultArtifactVersion(RWG.ID, true));
- ret.add(new DefaultArtifactVersion(MainMod.MOD_ID, true));
- ret.add(new DefaultArtifactVersion(BartWorksCrossmod.MOD_ID, true));
- return ret;
- }
-
- @Override
- public boolean registerBus(EventBus bus, LoadController controller) {
- bus.register(this);
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java
deleted file mode 100644
index f7fde1167d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.ASM;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Map;
-
-import net.minecraftforge.common.config.Configuration;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-import cpw.mods.fml.relauncher.FMLInjectionData;
-import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
-
-@IFMLLoadingPlugin.SortingIndex(Integer.MAX_VALUE) // Load as late as possible (after fastcraft/OptiFine).
-@IFMLLoadingPlugin.MCVersion("1.7.10")
-@IFMLLoadingPlugin.TransformerExclusions("com.github.bartimaeusnek.bartworks.ASM")
-@IFMLLoadingPlugin.Name(BWCorePlugin.BWCORE_PLUGIN_NAME)
-public class BWCorePlugin implements IFMLLoadingPlugin {
-
- public static final String BWCORE_PLUGIN_NAME = "BartWorks ASM Core Plugin";
-
- public static File minecraftDir;
-
- public BWCorePlugin() {
- // Injection Code taken from CodeChickenLib
- if (BWCorePlugin.minecraftDir != null) return; // get called twice, once for IFMLCallHook
- BWCorePlugin.minecraftDir = (File) FMLInjectionData.data()[6];
- // do all the configuration already now...
- new ConfigHandler(new Configuration(new File(new File(BWCorePlugin.minecraftDir, "config"), "bartworks.cfg")));
- BWCoreTransformer.shouldTransform[2] = false;
- }
-
- @Override
- public String[] getASMTransformerClass() {
- return new String[] { BWCoreTransformer.class.getName() };
- }
-
- @Override
- public String getModContainerClass() {
- return BWCore.class.getName();
- }
-
- @Override
- public String getSetupClass() {
- return null;
- }
-
- @Override
- @SuppressWarnings("rawtypes")
- public void injectData(Map<String, Object> data) {
- if (data.get("runtimeDeobfuscationEnabled") != null) {
- BWCoreTransformer.obfs = (boolean) data.get("runtimeDeobfuscationEnabled");
- }
- if (data.get("coremodList") != null) {
- for (Object o : (ArrayList) data.get("coremodList")) {
- if (o.toString()
- .contains("MicdoodlePlugin")) {
- BWCoreTransformer.shouldTransform[2] = ConfigHandler.enabledPatches[2];
- break;
- }
- }
- }
- }
-
- @Override
- public String getAccessTransformerClass() {
- return null;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java
deleted file mode 100644
index 38a5a70d27..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.ASM;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import net.minecraft.inventory.InventoryCrafting;
-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.world.World;
-
-import com.github.bartimaeusnek.bartworks.util.NonNullWrappedHashSet;
-import com.github.bartimaeusnek.bartworks.util.accessprioritylist.AccessPriorityList;
-import com.github.bartimaeusnek.bartworks.util.accessprioritylist.AccessPriorityListNode;
-
-public class BWCoreStaticReplacementMethodes {
-
- private static ThreadLocal<AccessPriorityList<IRecipe>> RECENTLYUSEDRECIPES = ThreadLocal
- .withInitial(AccessPriorityList::new);
-
- public static void clearRecentlyUsedRecipes() {
- // the easiest way to ensure the cache is flushed without causing synchronization overhead
- // is to just replace the whole ThreadLocal instance.
- RECENTLYUSEDRECIPES = ThreadLocal.withInitial(AccessPriorityList::new);
- }
-
- public static ItemStack findCachedMatchingRecipe(InventoryCrafting inventoryCrafting, World world) {
- int i = 0;
- ItemStack itemstack = null;
- ItemStack itemstack1 = null;
- int j;
-
- for (j = 0; j < inventoryCrafting.getSizeInventory(); ++j) {
- ItemStack itemstack2 = inventoryCrafting.getStackInSlot(j);
-
- if (itemstack2 != null) {
- if (i == 0) itemstack = itemstack2;
-
- if (i == 1) itemstack1 = itemstack2;
-
- ++i;
- }
- }
-
- if (i == 2 && itemstack.getItem() == itemstack1.getItem()
- && itemstack.stackSize == 1
- && itemstack1.stackSize == 1
- && itemstack.getItem()
- .isRepairable()) {
- Item item = itemstack.getItem();
- int j1 = item.getMaxDamage() - itemstack.getItemDamageForDisplay();
- int k = item.getMaxDamage() - itemstack1.getItemDamageForDisplay();
- int l = j1 + k + item.getMaxDamage() * 5 / 100;
- int i1 = item.getMaxDamage() - l;
-
- if (i1 < 0) i1 = 0;
-
- return new ItemStack(itemstack.getItem(), 1, i1);
-
- }
- IRecipe iPossibleRecipe = null;
- AccessPriorityList<IRecipe> cache = RECENTLYUSEDRECIPES.get();
- Iterator<AccessPriorityListNode<IRecipe>> it = cache.nodeIterator();
-
- while (it.hasNext()) {
- AccessPriorityListNode<IRecipe> recipeNode = it.next();
- iPossibleRecipe = recipeNode.getELEMENT();
-
- if (!iPossibleRecipe.matches(inventoryCrafting, world)) continue;
-
- cache.addPrioToNode(recipeNode);
- return iPossibleRecipe.getCraftingResult(inventoryCrafting);
- }
-
- HashSet<IRecipe> recipeSet = new NonNullWrappedHashSet<>();
- List<IRecipe> recipeList = CraftingManager.getInstance()
- .getRecipeList();
-
- for (IRecipe r : recipeList) {
- if (r.matches(inventoryCrafting, world)) recipeSet.add(r);
- }
-
- Object[] arr = recipeSet.toArray();
-
- if (arr.length == 0) return null;
-
- IRecipe recipe = (IRecipe) arr[0];
- ItemStack stack = recipe.getCraftingResult(inventoryCrafting);
-
- if (arr.length != 1) return stack;
-
- if (stack != null) cache.addLast(recipe);
-
- return stack;
- }
-
- private BWCoreStaticReplacementMethodes() {}
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java
deleted file mode 100644
index 02835e39c2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.ASM;
-
-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.GETFIELD;
-import static org.objectweb.asm.Opcodes.ICONST_0;
-import static org.objectweb.asm.Opcodes.IFNE;
-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.POP;
-
-import java.util.Arrays;
-import java.util.List;
-
-import net.minecraft.launchwrapper.IClassTransformer;
-
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldInsnNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.InsnNode;
-import org.objectweb.asm.tree.JumpInsnNode;
-import org.objectweb.asm.tree.LabelNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.VarInsnNode;
-
-public class BWCoreTransformer implements IClassTransformer {
-
- public static final String[] DESCRIPTIONFORCONFIG = { "REMOVING RAIN FROM LAST MILLENNIUM (EXU)",
- "REMOVING CREATURES FROM LAST MILLENNIUM (EXU)", "PATCHING THAUMCRAFT WAND PEDESTAL TO PREVENT VIS DUPLICATION",
- "PATCHING CRAFTING MANAGER FOR CACHING RECIPES" };
- public static final String[] CLASSESBEINGTRANSFORMED = {
- "com.rwtema.extrautils.worldgen.endoftime.WorldProviderEndOfTime",
- "com.rwtema.extrautils.worldgen.endoftime.ChunkProviderEndOfTime", "thaumcraft.common.tiles.TileWandPedestal",
- "net.minecraft.item.crafting.CraftingManager" };
- static boolean obfs;
-
- public static boolean[] shouldTransform = new boolean[BWCoreTransformer.CLASSESBEINGTRANSFORMED.length];
-
- /**
- * Made by DarkShaddow44
- */
- private static MethodNode transformThaumcraftWandPedestal(MethodNode method) {
- InsnList nu = new InsnList();
- for (int j = 0; j < method.instructions.size(); j++) {
- AbstractInsnNode instruction = method.instructions.get(j);
- nu.add(instruction);
- if (instruction.getOpcode() == INVOKEVIRTUAL) {
- MethodInsnNode invokevirtual = (MethodInsnNode) instruction;
- if ("addVis".equals(invokevirtual.name)) {
- AbstractInsnNode beginning = method.instructions.get(j - 7);
- LabelNode label = new LabelNode();
- nu.insertBefore(beginning, new VarInsnNode(ALOAD, 0));
- nu.insertBefore(
- beginning,
- new FieldInsnNode(
- GETFIELD,
- "thaumcraft/common/tiles/TileWandPedestal",
- obfs ? "field_145850_b" : "worldObj",
- "Lnet/minecraft/world/World;"));
- nu.insertBefore(
- beginning,
- new FieldInsnNode(
- GETFIELD,
- "net/minecraft/world/World",
- obfs ? "field_72995_K" : "isRemote",
- "Z"));
- nu.insertBefore(beginning, new JumpInsnNode(IFNE, label));
- nu.add(new InsnNode(POP));
- nu.add(label);
- j++; // Skip actual Pop
- }
- }
- }
- method.instructions = nu;
- return method;
- }
-
- public static byte[] transform(int id, byte[] basicClass) {
- if (!BWCoreTransformer.shouldTransform[id]) {
- BWCore.BWCORE_LOG
- .info("Patch: " + BWCoreTransformer.DESCRIPTIONFORCONFIG[id] + " is disabled, will not patch!");
- return basicClass;
- }
-
- if (id < BWCoreTransformer.CLASSESBEINGTRANSFORMED.length) {
- BWCore.BWCORE_LOG.info(BWCoreTransformer.DESCRIPTIONFORCONFIG[id]);
- ClassReader classReader = new ClassReader(basicClass);
- ClassNode classNode = new ClassNode();
- classReader.accept(classNode, ClassReader.SKIP_FRAMES);
- List<MethodNode> methods = classNode.methods;
- scase: switch (id) {
- case 0: {
- BWCore.BWCORE_LOG.info("Could find: " + BWCoreTransformer.CLASSESBEINGTRANSFORMED[id]);
- String name_deObfs = "canDoRainSnowIce";
-
- String dsc_deObfs = "(Lnet/minecraft/world/chunk/Chunk;)Z";
- for (int i = 0; i < methods.size(); i++) {
- if (methods.get(i).name.equalsIgnoreCase(name_deObfs)) {
- BWCore.BWCORE_LOG.info("Found " + name_deObfs + "! Removing!");
- methods.remove(i);
- break;
- }
- }
- BWCore.BWCORE_LOG.info("Creating new " + name_deObfs + "!");
- MethodNode nu = new MethodNode(ACC_PUBLIC, name_deObfs, dsc_deObfs, null, new String[0]);
- InsnList insnList = new InsnList();
- insnList.add(new InsnNode(ICONST_0));
- insnList.add(new InsnNode(IRETURN));
- nu.instructions = insnList;
- nu.maxLocals = 1;
- nu.maxStack = 1;
- methods.add(nu);
- break;
- }
- case 1: {
- BWCore.BWCORE_LOG.info("Could find: " + BWCoreTransformer.CLASSESBEINGTRANSFORMED[id]);
- String name_deObfs = "getPossibleCreatures";
- String name_src = "func_73155_a";
- String name_Obfs = "a";
- String dsc_deObfs = "(Lnet/minecraft/entity/EnumCreatureType;III)Ljava/util/List;";
- String dsc_Obfs = "(Lsx;III)Ljava/util/List;";
-
- for (int i = 0; i < methods.size(); i++) {
- if (ASMUtils.isCorrectMethod(methods.get(i), name_deObfs, name_Obfs, name_src)
- && ASMUtils.isCorrectMethod(methods.get(i), dsc_deObfs, dsc_Obfs)) {
- BWCore.BWCORE_LOG.info("Found " + name_deObfs + "! Patching!");
- MethodNode toPatch = methods.get(i);
- InsnList insnList = new InsnList();
- insnList.add(new InsnNode(ACONST_NULL));
- insnList.add(new InsnNode(ARETURN));
- toPatch.instructions = insnList;
- toPatch.maxStack = 1;
- toPatch.maxLocals = 5;
- methods.set(i, toPatch);
- break scase;
- }
- }
- }
- case 2: {
- BWCore.BWCORE_LOG.info("Could find: " + BWCoreTransformer.CLASSESBEINGTRANSFORMED[id]);
- String name_deObfs = "updateEntity";
- String name_src = "func_145845_h";
- String name_Obfs = "h";
- String dsc_universal = "()V";
-
- for (int i = 0; i < methods.size(); i++) {
- if (ASMUtils.isCorrectMethod(methods.get(i), name_deObfs, name_Obfs, name_src)
- && ASMUtils.isCorrectMethod(methods.get(i), dsc_universal, dsc_universal)) {
- BWCore.BWCORE_LOG.info("Found " + name_deObfs + "! Patching!");
- methods.set(i, BWCoreTransformer.transformThaumcraftWandPedestal(methods.get(i)));
- break scase;
- }
- }
- }
- case 3: {
- BWCore.BWCORE_LOG.info("Could find: " + BWCoreTransformer.CLASSESBEINGTRANSFORMED[id]);
- String name_deObfs = "findMatchingRecipe";
- String name_Obfs = "a";
- String name_src = "func_82787_a";
- for (MethodNode toPatch : methods) {
- if (ASMUtils.isCorrectMethod(toPatch, name_deObfs, name_Obfs, name_src)) {
- toPatch.instructions = new InsnList();
- toPatch.instructions.add(new VarInsnNode(ALOAD, 1));
- toPatch.instructions.add(new VarInsnNode(ALOAD, 2));
- toPatch.instructions.add(
- new MethodInsnNode(
- INVOKESTATIC,
- "com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes",
- "findCachedMatchingRecipe",
- "(Lnet/minecraft/inventory/InventoryCrafting;Lnet/minecraft/world/World;)Lnet/minecraft/item/ItemStack;",
- false));
- toPatch.instructions.add(new InsnNode(ARETURN));
- toPatch.localVariables.clear();
- toPatch.maxStack = 2;
- toPatch.maxLocals = 3;
- break scase;
- }
- }
- }
-
- default: {
- BWCore.BWCORE_LOG.info("Could not find: " + BWCoreTransformer.CLASSESBEINGTRANSFORMED[id]);
- return basicClass;
- }
- }
-
- classNode.methods = methods;
- ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
- classNode.accept(classWriter);
- byte[] ret = classWriter.toByteArray();
- if (Arrays.hashCode(basicClass) == Arrays.hashCode(ret))
- BWCore.BWCORE_LOG.warn("Could not patch: " + BWCoreTransformer.CLASSESBEINGTRANSFORMED[id]);
- return ret;
- }
- return basicClass;
- }
-
- @Override
- public byte[] transform(String name, String transformedName, byte[] basicClass) {
- for (int i = 0; i < BWCoreTransformer.CLASSESBEINGTRANSFORMED.length; i++) {
- if (name.equalsIgnoreCase(BWCoreTransformer.CLASSESBEINGTRANSFORMED[i])
- || transformedName.equalsIgnoreCase(BWCoreTransformer.CLASSESBEINGTRANSFORMED[i]))
- return BWCoreTransformer.transform(i, basicClass);
- }
- return basicClass;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java
deleted file mode 100644
index c104d09f3a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-
-import cpw.mods.fml.common.network.IGuiHandler;
-
-public class GuiHandler implements IGuiHandler {
-
- @Override
- public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
- return null;
- }
-
- @Override
- public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
- if (!SideReference.Side.Client) return this.getServerGuiElement(ID, player, world, x, y, z);
- return null;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java b/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java
deleted file mode 100644
index 818b67d6fc..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks;
-
-import static com.github.bartimaeusnek.bartworks.common.loaders.BioRecipeLoader.runOnServerStarted;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.removeIC2Recipes;
-import static gregtech.api.enums.GT_Values.VN;
-import static gregtech.api.enums.Mods.BartWorks;
-import static gregtech.api.enums.Mods.GTPlusPlus;
-
-import java.io.IOException;
-import java.util.Map;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.common.MinecraftForge;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import com.github.bartimaeusnek.bartworks.API.API_ConfigValues;
-import com.github.bartimaeusnek.bartworks.API.API_REFERENCE;
-import com.github.bartimaeusnek.bartworks.API.BioObjectAdder;
-import com.github.bartimaeusnek.bartworks.API.BioVatLogicAdder;
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.ClientEventHandler.TooltipEventHandler;
-import com.github.bartimaeusnek.bartworks.client.creativetabs.BioTab;
-import com.github.bartimaeusnek.bartworks.client.creativetabs.GT2Tab;
-import com.github.bartimaeusnek.bartworks.client.creativetabs.bartworksTab;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.loaders.ArtificialMicaLine;
-import com.github.bartimaeusnek.bartworks.common.loaders.BeforeGTPreload;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioCultureLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioLabLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.GTNHBlocks;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.common.loaders.LocalisationLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.RadioHatchMaterialLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.RecipeLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.RegisterServerCommands;
-import com.github.bartimaeusnek.bartworks.common.loaders.StaticRecipeChangeLoaders;
-import com.github.bartimaeusnek.bartworks.common.net.BW_Network;
-import com.github.bartimaeusnek.bartworks.server.EventHandler.ServerEventHandler;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.CircuitImprintLoader;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.CircuitPartLoader;
-import com.github.bartimaeusnek.bartworks.system.material.GT_Enhancement.PlatinumSludgeOverHaul;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.processingLoaders.DownTierLoader;
-import com.github.bartimaeusnek.bartworks.system.oredict.OreDictHandler;
-import com.github.bartimaeusnek.bartworks.util.ResultWrongSievert;
-import com.github.bartimaeusnek.bartworks.util.log.DebugLog;
-import com.github.bartimaeusnek.crossmod.galacticgreg.VoidMinerUtility;
-
-import cpw.mods.fml.common.FMLCommonHandler;
-import cpw.mods.fml.common.Mod;
-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.FMLServerStartedEvent;
-import cpw.mods.fml.common.event.FMLServerStartingEvent;
-import cpw.mods.fml.common.network.IGuiHandler;
-import cpw.mods.fml.common.network.NetworkRegistry;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.Mods;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.recipe.check.CheckRecipeResultRegistry;
-import gregtech.api.util.GT_OreDictUnificator;
-
-@Mod(modid = MainMod.MOD_ID, name = MainMod.NAME, version = API_REFERENCE.VERSION, dependencies = """
- required-after:IC2;\
- required-after:gregtech;\
- after:berriespp;\
- after:tectech;\
- after:GalacticraftMars;\
- after:GalacticraftCore;\
- after:Forestry;\
- after:ProjRed|Illumination;\
- after:RandomThings;\
- before:miscutils;""")
-public final class MainMod {
-
- public static final String NAME = "BartWorks";
- public static final String MOD_ID = Mods.Names.BART_WORKS;
- public static final String APIVERSION = "11";
- public static final Logger LOGGER = LogManager.getLogger(MainMod.NAME);
- public static final CreativeTabs GT2 = new GT2Tab("GT2C");
- public static final CreativeTabs BIO_TAB = new BioTab("BioTab");
- public static final CreativeTabs BWT = new bartworksTab(BartWorks.ID);
- public static final IGuiHandler GH = new GuiHandler();
-
- @Mod.Instance(MainMod.MOD_ID)
- public static MainMod instance;
-
- public static BW_Network BW_Network_instance = new BW_Network();
-
- public MainMod() {
- GregTech_API.sBeforeGTPreload.add(new BeforeGTPreload());
- }
-
- @Mod.EventHandler
- public void preInit(FMLPreInitializationEvent preinit) {
- if (GTPlusPlus.isModLoaded()) {
- MainMod.LOGGER.info("Found GT++, continuing");
- }
-
- if (API_ConfigValues.debugLog) {
- try {
- DebugLog.initDebugLog(preinit);
- } catch (IOException e) {
- MainMod.LOGGER.catching(e);
- }
- }
-
- WerkstoffLoader.setUp();
-
- if (ConfigHandler.BioLab) {
- BioCultureLoader.run();
- }
-
- Werkstoff.init();
- GregTech_API.sAfterGTPostload.add(new CircuitPartLoader());
- if (SideReference.Side.Client) {
- GregTech_API.sBeforeGTLoad.add(new PrefixTextureLinker());
- }
-
- }
-
- @Mod.EventHandler
- public void init(FMLInitializationEvent init) {
- if (SideReference.Side.Client && ConfigHandler.tooltips)
- MinecraftForge.EVENT_BUS.register(new TooltipEventHandler());
- ServerEventHandler serverEventHandler = new ServerEventHandler();
- if (SideReference.Side.Server) {
- MinecraftForge.EVENT_BUS.register(serverEventHandler);
- }
- FMLCommonHandler.instance()
- .bus()
- .register(serverEventHandler);
- if (ConfigHandler.BioLab) {
- BioLabLoader.run();
- }
-
- WerkstoffLoader.runInit();
-
- ItemRegistry.run();
- }
-
- @Mod.EventHandler
- public void postInit(FMLPostInitializationEvent postinit) {
-
- RecipeLoader.run();
-
- NetworkRegistry.INSTANCE.registerGuiHandler(MainMod.instance, MainMod.GH);
- if (ConfigHandler.BioLab) {
- GTNHBlocks.run();
- for (Map.Entry<BioVatLogicAdder.BlockMetaPair, Byte> pair : BioVatLogicAdder.BioVatGlass.getGlassMap()
- .entrySet()) {
- GT_OreDictUnificator.registerOre(
- "blockGlass" + VN[pair.getValue()],
- new ItemStack(
- pair.getKey()
- .getBlock(),
- 1,
- pair.getKey()
- .getaByte()));
- }
- }
- ArtificialMicaLine.runArtificialMicaRecipe();
- BioObjectAdder.regenerateBioFluids();
-
- WerkstoffLoader.run();
- LocalisationLoader.localiseAll();
-
- CheckRecipeResultRegistry.register(new ResultWrongSievert(0, ResultWrongSievert.NeededSievertType.EXACTLY));
-
- RadioHatchMaterialLoader.run();
- }
-
- @Mod.EventHandler
- public void onServerStarting(FMLServerStartingEvent event) {
- RegisterServerCommands.registerAll(event);
- }
-
- @Mod.EventHandler
- public void onServerStarted(FMLServerStartedEvent event) {
- MainMod.runOnPlayerJoined(ConfigHandler.classicMode, ConfigHandler.disableExtraGassesForEBF);
- }
-
- @Mod.EventHandler
- public void onModLoadingComplete(FMLLoadCompleteEvent event) {
- removeIC2Recipes();
- StaticRecipeChangeLoaders.addElectricImplosionCompressorRecipes();
- PlatinumSludgeOverHaul.replacePureElements();
-
- runOnServerStarted();
- StaticRecipeChangeLoaders.unificationRecipeEnforcer();
- VoidMinerUtility.generateDropMaps();
- }
-
- private static boolean recipesAdded;
-
- public static void runOnPlayerJoined(boolean classicMode, boolean disableExtraGasRecipes) {
- OreDictHandler.adaptCacheForWorld();
- CircuitImprintLoader.run();
- BioVatLogicAdder.RadioHatch.runBasicItemIntegration();
- if (!recipesAdded) {
- if (!disableExtraGasRecipes) StaticRecipeChangeLoaders.addEBFGasRecipes();
-
- if (classicMode) DownTierLoader.run();
-
- // StaticRecipeChangeLoaders.patchEBFMapForCircuitUnification();
-
- recipesAdded = true;
- }
-
- StaticRecipeChangeLoaders.fixEnergyRequirements();
- // StaticRecipeChangeLoaders.synchroniseCircuitUseMulti();
-
- // Accept recipe map changes into Buffers
- RecipeMap.ALL_RECIPE_MAPS.values()
- .forEach(
- map -> map.getBackend()
- .reInit());
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java
deleted file mode 100644
index 969398df47..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.ClientEventHandler;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.util.Pair;
-
-class TooltipCache {
-
- private static final HashMap<Pair<Integer, Short>, char[]> cache = new HashMap<>();
-
- static boolean put(ItemStack itemStack, List<String> tooltip) {
- Pair<Integer, Short> p = new Pair<>(Item.getIdFromItem(itemStack.getItem()), (short) itemStack.getItemDamage());
- if (TooltipCache.cache.containsKey(p) || tooltip.isEmpty()) {
- return false;
- }
- StringBuilder sb = new StringBuilder();
- for (String s : tooltip) {
- sb.append(s);
- sb.append(System.lineSeparator());
- }
- char[] rettype = sb.toString()
- .toCharArray();
- return TooltipCache.cache.put(p, rettype) == rettype;
- }
-
- static List<String> getTooltip(ItemStack itemStack) {
- Pair<Integer, Short> p = new Pair<>(Item.getIdFromItem(itemStack.getItem()), (short) itemStack.getItemDamage());
- char[] toTest = TooltipCache.cache.get(p);
- if (toTest == null) {
- return new ArrayList<>();
- }
- return Arrays.asList(new String(toTest).split(System.lineSeparator()));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java
deleted file mode 100644
index 9f7fb64e4b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.ClientEventHandler;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.event.entity.player.ItemTooltipEvent;
-
-import com.github.bartimaeusnek.bartworks.API.BioVatLogicAdder;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_Blocks;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.system.oredict.OreDictHandler;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-
-import cpw.mods.fml.common.Loader;
-import cpw.mods.fml.common.ModContainer;
-import cpw.mods.fml.common.eventhandler.EventPriority;
-import cpw.mods.fml.common.eventhandler.SubscribeEvent;
-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;
-
-@SideOnly(Side.CLIENT)
-public class TooltipEventHandler {
-
- @SideOnly(Side.CLIENT)
- @SubscribeEvent(priority = EventPriority.HIGHEST)
- public void getTooltip(ItemTooltipEvent event) {
-
- if (event == null || event.itemStack == null || event.itemStack.getItem() == null) return;
-
- if (TooltipCache.getTooltip(event.itemStack)
- .isEmpty()) {
- ItemStack tmp = event.itemStack.copy();
- Pair<Integer, Short> abstractedStack = new Pair<>(
- Item.getIdFromItem(tmp.getItem()),
- (short) tmp.getItemDamage());
- List<String> tooAdd = new ArrayList<>();
- if (ConfigHandler.sharedItemStackTooltip && OreDictHandler.getNonBWCache()
- .contains(abstractedStack)) {
- for (Pair<Integer, Short> pair : OreDictHandler.getNonBWCache()) {
- if (pair.equals(abstractedStack)) {
- GameRegistry.UniqueIdentifier UI = GameRegistry.findUniqueIdentifierFor(tmp.getItem());
- if (UI == null)
- UI = GameRegistry.findUniqueIdentifierFor(Block.getBlockFromItem(tmp.getItem()));
- if (UI != null) {
- for (ModContainer modContainer : Loader.instance()
- .getModList()) {
- if (MainMod.MOD_ID.equals(UI.modId) || BartWorksCrossmod.MOD_ID.equals(UI.modId)
- || "BWCore".equals(UI.modId)) break;
- if (UI.modId.equals(modContainer.getModId())) {
- tooAdd.add(
- "Shared ItemStack between " + ChatColorHelper.DARKGREEN
- + "BartWorks"
- + ChatColorHelper.GRAY
- + " and "
- + ChatColorHelper.RED
- + modContainer.getName());
- }
- }
- } else tooAdd.add(
- "Shared ItemStack between " + ChatColorHelper.DARKGREEN
- + "BartWorks"
- + ChatColorHelper.GRAY
- + " and another Mod, that doesn't use the ModContainer propperly!");
- }
- }
- }
-
- Block BLOCK = Block.getBlockFromItem(event.itemStack.getItem());
- if (BLOCK != null && BLOCK != Blocks.air) {
- if (BLOCK instanceof BW_Blocks) {
- TooltipCache.put(event.itemStack, tooAdd);
- return;
- }
- BioVatLogicAdder.BlockMetaPair PAIR = new BioVatLogicAdder.BlockMetaPair(
- BLOCK,
- (byte) event.itemStack.getItemDamage());
- HashMap<BioVatLogicAdder.BlockMetaPair, Byte> GLASSMAP = BioVatLogicAdder.BioVatGlass.getGlassMap();
- if (GLASSMAP.containsKey(PAIR)) {
- int tier = GLASSMAP.get(PAIR);
- tooAdd.add(
- StatCollector.translateToLocal("tooltip.glas.0.name") + " "
- + BW_ColorUtil.getColorForTier(tier)
- + GT_Values.VN[tier]
- + ChatColorHelper.RESET);
- } else if (BLOCK.getMaterial()
- .equals(Material.glass)) {
- tooAdd.add(
- StatCollector.translateToLocal("tooltip.glas.0.name") + " "
- + BW_ColorUtil.getColorForTier(3)
- + GT_Values.VN[3]
- + ChatColorHelper.RESET);
- }
- }
-
- TooltipCache.put(event.itemStack, tooAdd);
- event.toolTip.addAll(tooAdd);
- } else {
- event.toolTip.addAll(TooltipCache.getTooltip(event.itemStack));
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java
deleted file mode 100644
index 8d3d457e06..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.creativetabs;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.item.Item;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-
-public class BioTab extends CreativeTabs {
-
- public BioTab(String lable) {
- super(lable);
- }
-
- @Override
- public Item getTabIconItem() {
- return BioItemList.getPetriDish(null)
- .getItem();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java
deleted file mode 100644
index 5a42164597..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.creativetabs;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.item.Item;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-
-public class GT2Tab extends CreativeTabs {
-
- public GT2Tab(String lable) {
- super(lable);
- }
-
- @Override
- public Item getTabIconItem() {
- return ItemRegistry.TAB;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java
deleted file mode 100644
index 53be7436ce..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.creativetabs;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.item.Item;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-
-public class bartworksTab extends CreativeTabs {
-
- public bartworksTab(String lable) {
- super(lable);
- }
-
- @Override
- public Item getTabIconItem() {
- return ItemRegistry.ROCKCUTTER_HV;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java
deleted file mode 100644
index e2bb68b290..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.gui;
-
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.StatCollector;
-
-import org.lwjgl.opengl.GL11;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.core.block.kineticgenerator.container.ContainerWindKineticGenerator;
-import ic2.core.block.kineticgenerator.gui.GuiWindKineticGenerator;
-import ic2.core.util.GuiTooltipHelper;
-
-@SideOnly(Side.CLIENT)
-public class BW_GUIContainer_RotorBlock extends GuiWindKineticGenerator {
-
- public ContainerWindKineticGenerator container;
- public String name;
-
- public BW_GUIContainer_RotorBlock(ContainerWindKineticGenerator container1) {
- super(container1);
- this.container = container1;
- this.name = StatCollector.translateToLocal("tile.BWRotorBlock.0.name");
- }
-
- @Override
- protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
- this.fontRendererObj
- .drawString(this.name, (this.xSize - this.fontRendererObj.getStringWidth(this.name)) / 2, 6, 2157374);
- if (this.container.base.checkrotor()) {
- if (!this.container.base.rotorspace()) {
- this.fontRendererObj.drawString(
- StatCollector.translateToLocal("ic2.WindKineticGenerator.gui.rotorspace"),
- 27,
- 52,
- 2157374);
- } else if (this.container.base.checkrotor() && !this.container.base.guiisminWindStrength()) {
- this.fontRendererObj.drawString(
- StatCollector.translateToLocal("ic2.WindKineticGenerator.gui.windweak1"),
- 27,
- 52,
- 2157374);
- } else {
- this.fontRendererObj.drawString(this.container.base.getRotorhealth() + " %", 46, 52, 2157374);
- if (this.container.base.guiisoverload()) {
- GuiTooltipHelper.drawAreaTooltip(
- mouseX - this.guiLeft,
- mouseY - this.guiTop,
- StatCollector.translateToLocal("ic2.WindKineticGenerator.error.overload"),
- 44,
- 27,
- 79,
- 52);
- }
- }
- } else {
- this.fontRendererObj
- .drawString(StatCollector.translateToLocal("ic2.WindKineticGenerator.gui.rotormiss"), 27, 52, 2157374);
- }
- }
-
- @Override
- protected void drawGuiContainerBackgroundLayer(float f, int x, int y) {
- GL11.glColor3f(0.5f, 0.25f, 0.07f);
- this.mc.getTextureManager()
- .bindTexture(new ResourceLocation(MainMod.MOD_ID, "textures/GUI/GUIPrimitiveKUBox.png"));
- int j = (this.width - this.xSize) / 2;
- int k = (this.height - this.ySize) / 2;
- this.drawTexturedModalRect(j, k, 0, 0, this.xSize, this.ySize);
- if (this.container.base.guiisoverload() && this.container.base.checkrotor()) {
- this.drawTexturedModalRect(j + 44, k + 20, 176, 0, 30, 26);
- this.drawTexturedModalRect(j + 102, k + 20, 176, 0, 30, 26);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java
deleted file mode 100644
index 6bf5fd3fe1..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package com.github.bartimaeusnek.bartworks.client.renderer;
-
-import net.minecraft.block.Block;
-import net.minecraft.client.particle.EntityFX;
-import net.minecraft.client.renderer.RenderBlocks;
-import net.minecraft.client.renderer.Tessellator;
-import net.minecraft.util.IIcon;
-import net.minecraft.world.World;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.lwjgl.opengl.GL11;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.GregTech_API;
-
-@SideOnly(Side.CLIENT)
-public class BW_EICPistonVisualizer extends EntityFX {
-
- public BW_EICPistonVisualizer(World world, int x, int y, int z, int age) {
- super(world, x, y, z);
- this.prevPosX = this.posX;
- this.prevPosY = this.posY;
- this.prevPosZ = this.posZ;
- this.particleMaxAge = age;
- }
-
- @Override
- public void onUpdate() {
- if (this.particleAge++ >= this.particleMaxAge) this.setDead();
- }
-
- @Override
- public void renderParticle(Tessellator p_70539_1_, float p_70539_2_, float p_70539_3_, float p_70539_4_,
- float p_70539_5_, float p_70539_6_, float p_70539_7_) {
- Tessellator tessellator = Tessellator.instance;
- GL11.glDisable(GL11.GL_CULL_FACE);
- GL11.glDepthMask(false);
-
- RenderBlocks.getInstance().blockAccess = this.worldObj;
- RenderBlocks.getInstance()
- .setRenderFromInside(false);
-
- // Look at nearby block for correct tiered block to use
- Pair<Block, Integer> tieredBlock;
- if (this.worldObj != null) {
- int nX = (int) this.posX;
- int nY = (int) this.posY + 1;
- int nZ = (int) this.posZ;
- Block neighborBlock = this.worldObj.getBlock(nX, nY, nZ);
- int neighborMeta = this.worldObj.getBlockMetadata(nX, nY, nZ);
- tieredBlock = Pair.of(neighborBlock, neighborMeta);
- } else {
- tieredBlock = Pair.of(GregTech_API.sBlockMetal5, 2);
- }
-
- IIcon icon = tieredBlock.getKey()
- .getIcon(0, tieredBlock.getValue());
-
- double x = this.posX + 1;
- double z = this.posZ;
-
- double f11 = x - interpPosX;
- double f12 = this.posY - interpPosY;
- double f13 = z - interpPosZ;
- tessellator.setTranslation(f11 - x, f12 - this.posY, f13 - z);
- RenderBlocks.getInstance()
- .renderBlockUsingTexture(tieredBlock.getKey(), (int) x, (int) this.posY, (int) z, icon);
-
- x = this.posX - 1;
- z = this.posZ;
-
- f11 = x - interpPosX;
- f13 = z - interpPosZ;
- tessellator.setTranslation(f11 - x, f12 - this.posY, f13 - z);
- RenderBlocks.getInstance()
- .renderBlockUsingTexture(tieredBlock.getKey(), (int) x, (int) this.posY, (int) z, icon);
-
- x = this.posX;
- z = this.posZ + 1;
-
- f11 = x - interpPosX;
- f13 = z - interpPosZ;
- tessellator.setTranslation(f11 - x, f12 - this.posY, f13 - z);
- RenderBlocks.getInstance()
- .renderBlockUsingTexture(tieredBlock.getKey(), (int) x, (int) this.posY, (int) z, icon);
-
- x = this.posX;
- z = this.posZ - 1;
-
- f11 = x - interpPosX;
- f13 = z - interpPosZ;
- tessellator.setTranslation(f11 - x, f12 - this.posY, f13 - z);
- RenderBlocks.getInstance()
- .renderBlockUsingTexture(tieredBlock.getKey(), (int) x, (int) this.posY, (int) z, icon);
-
- tessellator.setTranslation(0d, 0d, 0d);
-
- GL11.glEnable(GL11.GL_CULL_FACE);
- GL11.glDepthMask(true);
- }
-
- @Override
- public int getFXLayer() {
- return 1;
- }
-
- @Override
- public boolean shouldRenderInPass(int pass) {
- return pass == 2;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java
deleted file mode 100644
index 4c27a2a3f9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.renderer;
-
-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.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 org.lwjgl.opengl.GL11;
-
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.BW_Meta_Items;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.CircuitImprintLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.render.GT_RenderUtil;
-
-@SideOnly(Side.CLIENT)
-public class BW_GT_ItemRenderer implements IItemRenderer {
-
- public BW_GT_ItemRenderer() {
- for (BW_Meta_Items.BW_GT_MetaGen_Item_Hook tItem : BW_Meta_Items.BW_GT_MetaGen_Item_Hook.sInstances) {
- MinecraftForgeClient.registerItemRenderer(tItem, this);
- }
- }
-
- @Override
- public boolean handleRenderType(ItemStack aStack, IItemRenderer.ItemRenderType aType) {
- if (!GT_Utility.isStackInvalid(aStack) && aStack.getItemDamage() >= 0) {
- return aType == IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON
- || aType == IItemRenderer.ItemRenderType.INVENTORY
- || aType == IItemRenderer.ItemRenderType.EQUIPPED
- || aType == IItemRenderer.ItemRenderType.ENTITY;
- }
- return false;
- }
-
- @Override
- public boolean shouldUseRenderHelper(IItemRenderer.ItemRenderType aType, ItemStack aStack,
- IItemRenderer.ItemRendererHelper aHelper) {
- if (GT_Utility.isStackInvalid(aStack)) {
- return false;
- }
- return aType == IItemRenderer.ItemRenderType.ENTITY;
- }
-
- @Override
- public void renderItem(IItemRenderer.ItemRenderType type, ItemStack aStack, Object... data) {
- if (!GT_Utility.isStackInvalid(aStack)) {
- short aMetaData = (short) aStack.getItemDamage();
- if (aMetaData >= 0) {
- BW_Meta_Items.BW_GT_MetaGen_Item_Hook aItem = (BW_Meta_Items.BW_GT_MetaGen_Item_Hook) aStack.getItem();
- GL11.glEnable(3042);
- if (type == IItemRenderer.ItemRenderType.ENTITY) {
- if (RenderItem.renderInFrame) {
- GL11.glScalef(0.85F, 0.85F, 0.85F);
- GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
- }
- GL11.glTranslated(-0.5D, -0.42D, 0.0D);
- }
-
- GL11.glColor3f(1.0F, 1.0F, 1.0F);
- IIcon tIcon = (IIcon) BW_Util.get2DCoordFrom1DArray(aMetaData, 0, 2, aItem.mIconList);
-
- Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
- GL11.glBlendFunc(770, 771);
- if (IItemRenderer.ItemRenderType.INVENTORY.equals(type)) {
- if (aMetaData < CircuitImprintLoader.reverseIDs)
- GT_RenderUtil.renderItemIcon(tIcon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
- else {
- for (int i = 0; i < 4; i++) {
- GT_RenderUtil.renderItemIcon(
- tIcon,
- 0.0D + i * 2D,
- 0.0D + i * 2D,
- 10.0D + i * 2D,
- 10.0D + i * 2D,
- 0.001D,
- 0.0F,
- 0.0F,
- -1.0F);
- }
- }
- } else if (aMetaData < CircuitImprintLoader.reverseIDs) ItemRenderer.renderItemIn2D(
- Tessellator.instance,
- tIcon.getMaxU(),
- tIcon.getMinV(),
- tIcon.getMinU(),
- tIcon.getMaxV(),
- tIcon.getIconWidth(),
- tIcon.getIconHeight(),
- 0.0625F);
-
- IIcon tOverlay = (IIcon) BW_Util.get2DCoordFrom1DArray(aMetaData, 1, 2, aItem.mIconList);
- GL11.glColor3f(1.0F, 1.0F, 1.0F);
- if (tOverlay != null) {
- Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
- GL11.glBlendFunc(770, 771);
- if (IItemRenderer.ItemRenderType.INVENTORY.equals(type)) {
- GT_RenderUtil.renderItemIcon(tOverlay, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
- } else {
- ItemRenderer.renderItemIn2D(
- Tessellator.instance,
- tOverlay.getMaxU(),
- tOverlay.getMinV(),
- tOverlay.getMinU(),
- tOverlay.getMaxV(),
- tOverlay.getIconWidth(),
- tOverlay.getIconHeight(),
- 0.0625F);
- }
- }
- }
-
- GL11.glDisable(3042);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java
deleted file mode 100644
index a082a44d31..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.renderer;
-
-import net.minecraft.block.Block;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.interfaces.IIconContainer;
-
-@SideOnly(Side.CLIENT)
-public class BW_GT_Vanilla_Texture implements IIconContainer {
-
- IIcon packed;
-
- public BW_GT_Vanilla_Texture(Block block, ForgeDirection side) {
- this.packed = block.getBlockTextureFromSide(side.flag);
- }
-
- public BW_GT_Vanilla_Texture(Block block, int side) {
- this.packed = block.getBlockTextureFromSide(side);
- }
-
- public BW_GT_Vanilla_Texture(IIcon packed) {
- this.packed = packed;
- }
-
- @Override
- public IIcon getIcon() {
- return this.packed;
- }
-
- @Override
- public IIcon getOverlayIcon() {
- return null;
- }
-
- @Override
- public ResourceLocation getTextureFile() {
- return new ResourceLocation(this.packed.getIconName());
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java
deleted file mode 100644
index 7bb04e0c39..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.renderer;
-
-import static gregtech.common.render.GT_Renderer_Block.renderNegativeXFacing;
-import static gregtech.common.render.GT_Renderer_Block.renderNegativeYFacing;
-import static gregtech.common.render.GT_Renderer_Block.renderNegativeZFacing;
-import static gregtech.common.render.GT_Renderer_Block.renderPositiveXFacing;
-import static gregtech.common.render.GT_Renderer_Block.renderPositiveYFacing;
-import static gregtech.common.render.GT_Renderer_Block.renderPositiveZFacing;
-
-import net.minecraft.block.Block;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.RenderBlocks;
-import net.minecraft.world.IBlockAccess;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import org.lwjgl.opengl.GL11;
-
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Block_TE;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Blocks;
-import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
-
-import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
-import cpw.mods.fml.client.registry.RenderingRegistry;
-import gregtech.GT_Mod;
-
-@ThreadSafeISBRH(perThread = true)
-public class BW_Renderer_Block_Ores implements ISimpleBlockRenderingHandler {
-
- public static BW_Renderer_Block_Ores INSTANCE;
- public static int renderID;
- public static final float blockMin = 0.0F;
- public static final float blockMax = 1.0F;
-
- public static void register() {
- renderID = RenderingRegistry.getNextAvailableRenderId();
- INSTANCE = new BW_Renderer_Block_Ores();
- RenderingRegistry.registerBlockHandler(INSTANCE);
- }
-
- @Override
- public void renderInventoryBlock(Block aBlock, int aMeta, int modelId, RenderBlocks aRenderer) {
- BW_MetaGenerated_Block_TE tTileEntity = ((BW_MetaGenerated_Blocks) aBlock).getProperTileEntityForRendering();
- tTileEntity.mMetaData = (short) aMeta;
- aRenderer.enableAO = false;
- aRenderer.useInventoryTint = true;
- aBlock.setBlockBoundsForItemRender();
- aRenderer.setRenderBoundsFromBlock(aBlock);
- GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
- GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
- renderNegativeYFacing(
- null,
- aRenderer,
- aBlock,
- 0,
- 0,
- 0,
- tTileEntity.getTexture(aBlock, ForgeDirection.DOWN),
- true);
- renderPositiveYFacing(
- null,
- aRenderer,
- aBlock,
- 0,
- 0,
- 0,
- tTileEntity.getTexture(aBlock, ForgeDirection.UP),
- true);
- renderNegativeZFacing(
- null,
- aRenderer,
- aBlock,
- 0,
- 0,
- 0,
- tTileEntity.getTexture(aBlock, ForgeDirection.NORTH),
- true);
- renderPositiveZFacing(
- null,
- aRenderer,
- aBlock,
- 0,
- 0,
- 0,
- tTileEntity.getTexture(aBlock, ForgeDirection.SOUTH),
- true);
- renderNegativeXFacing(
- null,
- aRenderer,
- aBlock,
- 0,
- 0,
- 0,
- tTileEntity.getTexture(aBlock, ForgeDirection.WEST),
- true);
- renderPositiveXFacing(
- null,
- aRenderer,
- aBlock,
- 0,
- 0,
- 0,
- tTileEntity.getTexture(aBlock, ForgeDirection.EAST),
- true);
- aRenderer.setRenderBoundsFromBlock(aBlock);
- aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax);
- GL11.glTranslatef(0.5F, 0.5F, 0.5F);
- aRenderer.useInventoryTint = false;
- }
-
- // spotless:off
- @Override
- public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int modelId, RenderBlocks aRenderer) {
- BW_MetaGenerated_Blocks tBlock = (BW_MetaGenerated_Blocks) aBlock;
- if(tBlock == null) return false;
-
- BW_MetaGenerated_Block_TE fakeTileEntity = tBlock.getProperTileEntityForRendering(); // meh
- if(fakeTileEntity == null) return false;
-
- BW_MetaGenerated_Block_TE actualTileEntity = (BW_MetaGenerated_Block_TE) aWorld.getTileEntity(aX, aY, aZ);
- if(actualTileEntity == null) return false;
-
- fakeTileEntity.mMetaData = actualTileEntity.mMetaData;
- aRenderer.useInventoryTint = false;
- aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax);
- aRenderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion;
- aRenderer.setRenderBoundsFromBlock(aBlock);
- renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, fakeTileEntity.getTexture(aBlock, ForgeDirection.DOWN), true);
- renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, fakeTileEntity.getTexture(aBlock, ForgeDirection.UP), true);
- renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, fakeTileEntity.getTexture(aBlock, ForgeDirection.NORTH), true);
- renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, fakeTileEntity.getTexture(aBlock, ForgeDirection.SOUTH), true);
- renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, fakeTileEntity.getTexture(aBlock, ForgeDirection.WEST), true);
- renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, fakeTileEntity.getTexture(aBlock, ForgeDirection.EAST), true);
- return true;
- }
- // spotless:on
-
- @Override
- public boolean shouldRender3DInInventory(int modelId) {
- return true;
- }
-
- @Override
- public int getRenderId() {
- return renderID;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java
deleted file mode 100644
index ce87e4a68a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.renderer;
-
-import net.minecraft.block.Block;
-import net.minecraft.client.renderer.RenderBlocks;
-import net.minecraft.client.renderer.Tessellator;
-import net.minecraft.world.IBlockAccess;
-
-import org.lwjgl.opengl.GL11;
-
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_GlasBlocks;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_GlasBlocks2;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-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;
-
-@SideOnly(Side.CLIENT)
-@ThreadSafeISBRH(perThread = false)
-public class RendererGlasBlock implements ISimpleBlockRenderingHandler {
-
- public static int renderID;
- public static RendererGlasBlock INSTANCE;
-
- public static void register() {
- renderID = RenderingRegistry.getNextAvailableRenderId();
- INSTANCE = new RendererGlasBlock();
- RenderingRegistry.registerBlockHandler(INSTANCE);
- }
-
- @Override
- public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
- Tessellator tessellator = Tessellator.instance;
- block.setBlockBoundsForItemRender();
- renderer.setRenderBoundsFromBlock(block);
- GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
- GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
- tessellator.startDrawingQuads();
- tessellator.setNormal(0.0F, -1.0F, 0.0F);
- renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata));
- tessellator.draw();
- tessellator.startDrawingQuads();
- tessellator.setNormal(0.0F, 1.0F, 0.0F);
- renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, metadata));
- tessellator.draw();
- tessellator.startDrawingQuads();
- tessellator.setNormal(0.0F, 0.0F, -1.0F);
- renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, metadata));
- tessellator.draw();
- tessellator.startDrawingQuads();
- tessellator.setNormal(0.0F, 0.0F, 1.0F);
- renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, metadata));
- tessellator.draw();
- tessellator.startDrawingQuads();
- tessellator.setNormal(-1.0F, 0.0F, 0.0F);
- renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, metadata));
- tessellator.draw();
- tessellator.startDrawingQuads();
- tessellator.setNormal(1.0F, 0.0F, 0.0F);
- renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata));
- tessellator.draw();
- GL11.glTranslatef(0.5F, 0.5F, 0.5F);
- }
-
- // spotless:off
- @Override
- public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
- RenderBlocks renderer) {
- if (block instanceof BW_GlasBlocks) {
- renderer.renderStandardBlock(ItemRegistry.bw_fake_glasses, x, y, z);
- renderer.renderStandardBlockWithColorMultiplier(block, x, y, z,
- ((BW_GlasBlocks) block).getColor(world.getBlockMetadata(x, y, z))[0] / 255f,
- ((BW_GlasBlocks) block).getColor(world.getBlockMetadata(x, y, z))[1] / 255f,
- ((BW_GlasBlocks) block).getColor(world.getBlockMetadata(x, y, z))[2] / 255f);
- }
- if (block instanceof BW_GlasBlocks2) {
- renderer.renderStandardBlock(ItemRegistry.bw_fake_glasses2, x, y, z);
- renderer.renderStandardBlockWithColorMultiplier(block, x, y, z,
- ((BW_GlasBlocks2) block).getColor(world.getBlockMetadata(x, y, z))[0] / 255f,
- ((BW_GlasBlocks2) block).getColor(world.getBlockMetadata(x, y, z))[1] / 255f,
- ((BW_GlasBlocks2) block).getColor(world.getBlockMetadata(x, y, z))[2] / 255f);
- }
- return true;
- }
- // spotless:on
-
- @Override
- public boolean shouldRender3DInInventory(int modelId) {
- return true;
- }
-
- @Override
- public int getRenderId() {
- return RendererGlasBlock.renderID;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java
deleted file mode 100644
index 7a12074e02..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.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.util.MathHelper;
-import net.minecraft.world.IBlockAccess;
-import net.minecraftforge.fluids.BlockFluidBase;
-import net.minecraftforge.fluids.IFluidBlock;
-
-import com.github.bartimaeusnek.bartworks.common.blocks.BioFluidBlock;
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_BioVat;
-import com.github.bartimaeusnek.bartworks.util.Coords;
-import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
-
-import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-@SideOnly(Side.CLIENT)
-@ThreadSafeISBRH(perThread = false)
-public class RendererSwitchingColorFluid implements ISimpleBlockRenderingHandler {
-
- private static final float LIGHT_Y_NEG = 0.5f;
- private static final float LIGHT_Y_POS = 1f;
- private static final float LIGHT_XZ_NEG = 0.8f;
- private static final float LIGHT_XZ_POS = 0.6f;
- private static final float THREE_QUARTERS_FILLED = 0.875f;
- private static final double RENDER_OFFSET = 0.0010000000474974513;
-
- public static RendererSwitchingColorFluid instance;
-
- public static void register() {
- instance = new RendererSwitchingColorFluid();
- }
-
- private float getFluidHeightAverage(float[] flow) {
- float total = 0.0f;
- int count = 0;
- float end = 0.0f;
- for (float aFlow : flow) {
- if (aFlow >= RendererSwitchingColorFluid.THREE_QUARTERS_FILLED
- && end != RendererSwitchingColorFluid.LIGHT_Y_POS) {
- end = aFlow;
- }
- if (aFlow >= 0.0f) {
- total += aFlow;
- ++count;
- }
- }
- if (end == 0.0f && count != 0) {
- end = total / count;
- }
- return end;
- }
-
- private float getFluidHeightForRender(IBlockAccess world, int x, int y, int z, BlockFluidBase block) {
-
- if (world.getBlock(x, y, z) == block) {
- Block vOrigin = world.getBlock(x, y + 1, z);
- if (vOrigin.getMaterial()
- .isLiquid() || vOrigin instanceof IFluidBlock) {
- return RendererSwitchingColorFluid.LIGHT_Y_POS;
- }
- if (world.getBlockMetadata(x, y, z) == block.getMaxRenderHeightMeta()) {
- return RendererSwitchingColorFluid.THREE_QUARTERS_FILLED;
- }
- }
- return !world.getBlock(x, y, z)
- .getMaterial()
- .isSolid() && world.getBlock(x, y + 1, z) == block ? RendererSwitchingColorFluid.LIGHT_Y_POS
- : block.getQuantaPercentage(world, x, y, z) * RendererSwitchingColorFluid.THREE_QUARTERS_FILLED;
- }
-
- public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {}
-
- @SideOnly(Side.CLIENT)
- public boolean renderWorldBlock(IBlockAccess iBlockAccess, int x, int y, int z, Block block, int modelId,
- RenderBlocks renderer) {
- if (!(block instanceof BioFluidBlock)) return false;
- Tessellator tessellator = Tessellator.instance;
- Coords blockat = new Coords(
- x,
- y,
- z,
- iBlockAccess.getTileEntity(x, y, z)
- .getWorldObj().provider.dimensionId);
- Integer rgb = GT_TileEntity_BioVat.staticColorMap.get(blockat);
-
- int r, g, b;
-
- if (rgb != null) {
- r = rgb >> 16 & 0xFF;
- g = rgb >> 8 & 0xFF;
- b = rgb & 0xFF;
- } else {
- r = 0;
- g = 0;
- b = 255;
- }
- float red = r / 255f, green = g / 255f, blue = b / 255f;
-
- BlockFluidBase blockFluidBase = (BlockFluidBase) block;
- boolean renderTop = iBlockAccess.getBlock(x, y + 1, z) != blockFluidBase;
- boolean renderBottom = block.shouldSideBeRendered(iBlockAccess, x, y - 1, z, 0)
- && iBlockAccess.getBlock(x, y - 1, z) != blockFluidBase;
- boolean[] renderSides = { block.shouldSideBeRendered(iBlockAccess, x, y, z - 1, 2),
- block.shouldSideBeRendered(iBlockAccess, x, y, z + 1, 3),
- block.shouldSideBeRendered(iBlockAccess, x - 1, y, z, 4),
- block.shouldSideBeRendered(iBlockAccess, x + 1, y, z, 5) };
- if (!renderTop && !renderBottom && !renderSides[0] && !renderSides[1] && !renderSides[2] && !renderSides[3]) {
- return false;
- }
- boolean rendered = false;
- float fluidHeightForRender = this.getFluidHeightForRender(iBlockAccess, x, y, z, blockFluidBase);
- double heightNW, heightSW, heightSE, heightNE;
-
- if (fluidHeightForRender != RendererSwitchingColorFluid.LIGHT_Y_POS) {
- float fluidHeightForRender1 = this.getFluidHeightForRender(iBlockAccess, x - 1, y, z - 1, blockFluidBase);
- float fluidHeightForRender2 = this.getFluidHeightForRender(iBlockAccess, x - 1, y, z, blockFluidBase);
- float fluidHeightForRender3 = this.getFluidHeightForRender(iBlockAccess, x - 1, y, z + 1, blockFluidBase);
- float fluidHeightForRender4 = this.getFluidHeightForRender(iBlockAccess, x, y, z - 1, blockFluidBase);
- float fluidHeightForRender5 = this.getFluidHeightForRender(iBlockAccess, x, y, z + 1, blockFluidBase);
- float fluidHeightForRender6 = this.getFluidHeightForRender(iBlockAccess, x + 1, y, z - 1, blockFluidBase);
- float fluidHeightForRender7 = this.getFluidHeightForRender(iBlockAccess, x + 1, y, z, blockFluidBase);
- float fluidHeightForRender8 = this.getFluidHeightForRender(iBlockAccess, x + 1, y, z + 1, blockFluidBase);
- heightNW = this.getFluidHeightAverage(
- new float[] { fluidHeightForRender1, fluidHeightForRender2, fluidHeightForRender4,
- fluidHeightForRender });
- heightSW = this.getFluidHeightAverage(
- new float[] { fluidHeightForRender2, fluidHeightForRender3, fluidHeightForRender5,
- fluidHeightForRender });
- heightSE = this.getFluidHeightAverage(
- new float[] { fluidHeightForRender5, fluidHeightForRender7, fluidHeightForRender8,
- fluidHeightForRender });
- heightNE = this.getFluidHeightAverage(
- new float[] { fluidHeightForRender4, fluidHeightForRender6, fluidHeightForRender7,
- fluidHeightForRender });
- } else {
- heightNW = fluidHeightForRender;
- heightSW = fluidHeightForRender;
- heightSE = fluidHeightForRender;
- heightNE = fluidHeightForRender;
- }
-
- if (renderer.renderAllFaces || renderTop) {
- rendered = true;
- IIcon iconStill = this.getNullCheckedIiconOrFallbackTexture();
- float flowDir = (float) BlockFluidBase.getFlowDirection(iBlockAccess, x, y, z);
-
- heightNW -= RendererSwitchingColorFluid.RENDER_OFFSET;
- heightSW -= RendererSwitchingColorFluid.RENDER_OFFSET;
- heightSE -= RendererSwitchingColorFluid.RENDER_OFFSET;
- heightNE -= RendererSwitchingColorFluid.RENDER_OFFSET;
-
- double dInterpolatedU, dInterpolatedV, dInterpolatedU2, dInterpolatedV2, dInterpolatedU3, dInterpolatedV3,
- dInterpolatedU4, dInterpolatedV4;
-
- if (flowDir < -999.0f) {
- dInterpolatedU = iconStill.getInterpolatedU(0.0);
- dInterpolatedV = iconStill.getInterpolatedV(0.0);
- dInterpolatedU2 = dInterpolatedU;
- dInterpolatedV2 = iconStill.getInterpolatedV(16.0);
- dInterpolatedU3 = iconStill.getInterpolatedU(16.0);
- dInterpolatedV3 = dInterpolatedV2;
- dInterpolatedU4 = dInterpolatedU3;
- dInterpolatedV4 = dInterpolatedV;
- } else {
- float xFlow = MathHelper.sin(flowDir) * 0.25f, zFlow = MathHelper.cos(flowDir) * 0.25f;
- dInterpolatedU = iconStill.getInterpolatedU(8.0f + (-zFlow - xFlow) * 16.0f);
- dInterpolatedV = iconStill.getInterpolatedV(8.0f + (-zFlow + xFlow) * 16.0f);
- dInterpolatedU2 = iconStill.getInterpolatedU(8.0f + (-zFlow + xFlow) * 16.0f);
- dInterpolatedV2 = iconStill.getInterpolatedV(8.0f + (zFlow + xFlow) * 16.0f);
- dInterpolatedU3 = iconStill.getInterpolatedU(8.0f + (zFlow + xFlow) * 16.0f);
- dInterpolatedV3 = iconStill.getInterpolatedV(8.0f + (zFlow - xFlow) * 16.0f);
- dInterpolatedU4 = iconStill.getInterpolatedU(8.0f + (zFlow - xFlow) * 16.0f);
- dInterpolatedV4 = iconStill.getInterpolatedV(8.0f + (-zFlow - xFlow) * 16.0f);
- }
-
- tessellator.setBrightness(block.getMixedBrightnessForBlock(iBlockAccess, x, y, z));
- tessellator.setColorOpaque_F(
- RendererSwitchingColorFluid.LIGHT_Y_POS * red,
- RendererSwitchingColorFluid.LIGHT_Y_POS * green,
- RendererSwitchingColorFluid.LIGHT_Y_POS * blue);
-
- tessellator.addVertexWithUV(x, y + heightNW, z, dInterpolatedU, dInterpolatedV);
- tessellator.addVertexWithUV(x, y + heightSW, z + 1, dInterpolatedU2, dInterpolatedV2);
- tessellator.addVertexWithUV(x + 1, y + heightSE, z + 1, dInterpolatedU3, dInterpolatedV3);
- tessellator.addVertexWithUV(x + 1, y + heightNE, z, dInterpolatedU4, dInterpolatedV4);
- tessellator.addVertexWithUV(x, y + heightNW, z, dInterpolatedU, dInterpolatedV);
- tessellator.addVertexWithUV(x + 1, y + heightNE, z, dInterpolatedU4, dInterpolatedV4);
- tessellator.addVertexWithUV(x + 1, y + heightSE, z + 1, dInterpolatedU3, dInterpolatedV3);
- tessellator.addVertexWithUV(x, y + heightSW, z + 1, dInterpolatedU2, dInterpolatedV2);
- }
-
- if (renderer.renderAllFaces || renderBottom) {
- rendered = true;
- tessellator.setBrightness(block.getMixedBrightnessForBlock(iBlockAccess, x, y - 1, z));
- tessellator.setColorOpaque_F(
- RendererSwitchingColorFluid.LIGHT_Y_NEG * red,
- RendererSwitchingColorFluid.LIGHT_Y_NEG * green,
- RendererSwitchingColorFluid.LIGHT_Y_NEG * blue);
- renderer.renderFaceYNeg(
- block,
- x,
- y + RendererSwitchingColorFluid.RENDER_OFFSET,
- z,
- this.getNullCheckedIiconOrFallbackTexture());
- }
-
- for (int side = 0; side < 4; ++side) {
- int x2 = x, z2 = z;
-
- switch (side) {
- case 0:
- --z2;
- break;
- case 1:
- ++z2;
- break;
- case 2:
- --x2;
- break;
- case 3:
- ++x2;
- break;
- default:
- break;
- }
-
- IIcon iconFlow = this.getNullCheckedIiconOrFallbackTexture();
-
- if (renderer.renderAllFaces || renderSides[side]) {
- rendered = true;
- double dHeight1, dHeight2, dXcoord1, dXcoord2, dZcoord1, dZcoord2;
- dZcoord2 = switch (side) {
- case 0 -> {
- dHeight1 = heightNW;
- dHeight2 = heightNE;
- dXcoord1 = x;
- dXcoord2 = x + 1;
- dZcoord1 = z + RendererSwitchingColorFluid.RENDER_OFFSET;
- yield z + RendererSwitchingColorFluid.RENDER_OFFSET;
- }
- case 1 -> {
- dHeight1 = heightSE;
- dHeight2 = heightSW;
- dXcoord1 = x + 1;
- dXcoord2 = x;
- dZcoord1 = z + 1 - RendererSwitchingColorFluid.RENDER_OFFSET;
- yield z + 1 - RendererSwitchingColorFluid.RENDER_OFFSET;
- }
- case 2 -> {
- dHeight1 = heightSW;
- dHeight2 = heightNW;
- dXcoord1 = x + RendererSwitchingColorFluid.RENDER_OFFSET;
- dXcoord2 = x + RendererSwitchingColorFluid.RENDER_OFFSET;
- dZcoord1 = z + 1;
- yield z;
- }
- default -> {
- dHeight1 = heightNE;
- dHeight2 = heightSE;
- dXcoord1 = x + 1 - RendererSwitchingColorFluid.RENDER_OFFSET;
- dXcoord2 = x + 1 - RendererSwitchingColorFluid.RENDER_OFFSET;
- dZcoord1 = z;
- yield z + 1;
- }
- };
- float u1Flow = iconFlow.getInterpolatedU(0.0);
- float u2Flow = iconFlow.getInterpolatedU(8.0);
- float v1Flow = iconFlow.getInterpolatedV((1.0 - dHeight1) * 16.0 * 0.5);
- float v2Flow = iconFlow.getInterpolatedV((1.0 - dHeight2) * 16.0 * 0.5);
- float v3Flow = iconFlow.getInterpolatedV(8.0);
- tessellator.setBrightness(block.getMixedBrightnessForBlock(iBlockAccess, x2, y, z2));
- float sideLighting;
- if (side < 2) {
- sideLighting = RendererSwitchingColorFluid.LIGHT_XZ_NEG;
- } else {
- sideLighting = RendererSwitchingColorFluid.LIGHT_XZ_POS;
- }
- tessellator.setColorOpaque_F(
- RendererSwitchingColorFluid.LIGHT_Y_POS * sideLighting * red,
- RendererSwitchingColorFluid.LIGHT_Y_POS * sideLighting * green,
- RendererSwitchingColorFluid.LIGHT_Y_POS * sideLighting * blue);
-
- tessellator.addVertexWithUV(dXcoord1, y + dHeight1, dZcoord1, u1Flow, v1Flow);
- tessellator.addVertexWithUV(dXcoord2, y + dHeight2, dZcoord2, u2Flow, v2Flow);
- tessellator.addVertexWithUV(dXcoord2, y, dZcoord2, u2Flow, v3Flow);
- tessellator.addVertexWithUV(dXcoord1, y, dZcoord1, u1Flow, v3Flow);
- tessellator.addVertexWithUV(dXcoord1, y + dHeight1, dZcoord1, u1Flow, v1Flow);
- tessellator.addVertexWithUV(dXcoord1, y, dZcoord1, u1Flow, v3Flow);
- tessellator.addVertexWithUV(dXcoord2, y, dZcoord2, u2Flow, v3Flow);
- tessellator.addVertexWithUV(dXcoord2, y + dHeight2, dZcoord2, u2Flow, v2Flow);
- }
- }
- renderer.renderMinY = 0.0;
- renderer.renderMaxY = 1.0;
- return rendered;
- }
-
- public boolean shouldRender3DInInventory(int modelId) {
- return false;
- }
-
- public int getRenderId() {
- return FluidLoader.renderID;
- }
-
- private IIcon getNullCheckedIiconOrFallbackTexture() {
- return FluidLoader.autogenIIcon != null ? FluidLoader.autogenIIcon
- : ((TextureMap) Minecraft.getMinecraft()
- .getTextureManager()
- .getTexture(TextureMap.locationBlocksTexture)).getAtlasSprite("missingno");
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java b/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java
deleted file mode 100644
index 09df8f98f8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.client.textures;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.stream.Stream;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-
-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.enums.Textures;
-import gregtech.api.interfaces.IIconContainer;
-
-@SideOnly(Side.CLIENT)
-public class PrefixTextureLinker implements Runnable {
-
- public static Map<OrePrefixes, HashMap<TextureSet, Textures.ItemIcons.CustomIcon>> texMap = new HashMap<>();
- public static Map<OrePrefixes, HashMap<TextureSet, IIconContainer>> texMapBlocks = new HashMap<>();
- public static Map<TextureSet, Short> blockTexMap = new HashMap<>();
-
- private static void fillBlockTexMap() {
- blockTexMap.put(TextureSet.SET_QUARTZ, TextureSet.INDEX_block4);
- Stream.of(OrePrefixes.blockCasing, OrePrefixes.blockCasingAdvanced)
- .forEach(prefixes -> {
- HashMap<TextureSet, IIconContainer> curr = new HashMap<>();
- Arrays.stream(TextureSet.class.getFields())
- .filter(
- field -> field.getName()
- .contains("SET"))
- .forEach(SET -> {
- try {
- curr.put(
- (TextureSet) SET.get(null),
- new Textures.BlockIcons.CustomIcon(
- "materialicons/" + SET.getName()
- .substring(4) + "/" + prefixes));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- });
- texMapBlocks.put(prefixes, curr);
- });
- }
-
- private static void fillItemTexMap() {
- Arrays.stream(OrePrefixes.values())
- .filter(
- prefixes -> prefixes != OrePrefixes.rod && prefixes.mTextureIndex == -1
- && Werkstoff.GenerationFeatures.getPrefixDataRaw(prefixes) != 0)
- .forEach(prefixes -> {
- HashMap<TextureSet, Textures.ItemIcons.CustomIcon> curr = new HashMap<>();
- Arrays.stream(TextureSet.class.getFields())
- .filter(
- field -> field.getName()
- .contains("SET"))
- .forEach(SET -> {
- try {
- curr.put(
- (TextureSet) SET.get(null),
- new Textures.ItemIcons.CustomIcon(
- "materialicons/" + SET.getName()
- .substring(4) + "/" + prefixes));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- });
- texMap.put(prefixes, curr);
- });
- }
-
- @Override
- public void run() {
- fillItemTexMap();
- fillBlockTexMap();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java
deleted file mode 100644
index 1a00d16d85..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.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.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.IIcon;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.GregTech_API;
-
-public class BW_Blocks extends Block {
-
- @SideOnly(Side.CLIENT)
- protected IIcon[] texture;
-
- String[] textureNames;
- protected String name;
-
- public BW_Blocks(String name, String[] texture) {
- super(Material.anvil);
- this.setHardness(15.0F);
- this.setResistance(30.0F);
- this.name = name;
- this.textureNames = texture;
- this.setCreativeTab(MainMod.GT2);
- GregTech_API.registerMachineBlock(this, -1);
- }
-
- public BW_Blocks(String name, String[] texture, CreativeTabs tabs) {
- super(Material.anvil);
- this.setHardness(15.0F);
- this.setResistance(30.0F);
- this.name = name;
- this.textureNames = texture;
- this.setCreativeTab(tabs);
- GregTech_API.registerMachineBlock(this, -1);
- }
-
- public BW_Blocks(String name, String[] texture, CreativeTabs tabs, Material material) {
- super(material);
- this.setHardness(15.0F);
- this.setResistance(30.0F);
- this.name = name;
- this.textureNames = texture;
- this.setCreativeTab(tabs);
- GregTech_API.registerMachineBlock(this, -1);
- }
-
- @Override
- public int damageDropped(int meta) {
- return meta;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) {
- for (int i = 0; i < this.textureNames.length; i++) {
- list.add(new ItemStack(item, 1, i));
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(int side, int meta) {
- return meta < this.texture.length ? this.texture[meta] : this.texture[0];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerBlockIcons(IIconRegister par1IconRegister) {
- this.texture = new IIcon[this.textureNames.length];
- for (int i = 0; i < this.textureNames.length; i++) {
- this.texture[i] = par1IconRegister.registerIcon(this.textureNames[i]);
- }
- }
-
- @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, aWorld.getBlockMetadata(aX, aY, aZ))) {
- GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
- }
- }
-
- @Override
- public String getUnlocalizedName() {
- return this.name;
- }
-
- @Override
- public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
- return false;
- }
-
- @Override
- public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
- return false;
- }
-
- @Override
- public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java
deleted file mode 100644
index c60f63129a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.blocks;
-
-import net.minecraft.block.material.Material;
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.util.IIcon;
-import net.minecraft.world.IBlockAccess;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.renderer.RendererGlasBlock;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public class BW_GlasBlocks extends BW_Blocks {
-
- @SideOnly(Side.CLIENT)
- private IIcon[] connectedTexture;
-
- private final boolean connectedTex;
- private boolean fake;
- private short[][] color = new short[this.textureNames.length][3];
-
- public BW_GlasBlocks(String name, String[] texture, CreativeTabs tabs) {
- super(name, texture, tabs, Material.glass);
- this.connectedTex = false;
- }
-
- public BW_GlasBlocks(String name, String[] texture, short[][] color, CreativeTabs tabs, boolean connectedTex,
- boolean fake) {
- super(name, texture, tabs, Material.glass);
- this.connectedTex = connectedTex;
- this.color = color;
- this.fake = fake;
- }
-
- public short[] getColor(int meta) {
- return meta < this.texture.length ? this.color[meta] : this.color[0];
- }
-
- @Override
- public boolean isOpaqueCube() {
- return false;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public boolean shouldSideBeRendered(IBlockAccess worldClient, int xCoord, int yCoord, int zCoord, int aSide) {
- if (worldClient.getBlock(xCoord, yCoord, zCoord) instanceof BW_GlasBlocks) return false;
- return super.shouldSideBeRendered(worldClient, xCoord, yCoord, zCoord, aSide);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(int side, int meta) {
- return meta < this.texture.length ? this.texture[meta] : this.texture[0];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerBlockIcons(IIconRegister par1IconRegister) {
- if (!this.connectedTex) {
- this.texture = new IIcon[this.textureNames.length];
- for (int i = 0; i < this.textureNames.length; i++) {
- this.texture[i] = par1IconRegister.registerIcon(this.textureNames[i]);
- }
- return;
- }
- this.texture = new IIcon[this.textureNames.length];
- this.connectedTexture = new IIcon[16];
- for (int i = 0; i < this.textureNames.length; i++) {
- this.texture[i] = par1IconRegister.registerIcon(this.textureNames[i]);
- String[] splitname = this.textureNames[0].split(":");
- for (int j = 0; j < 16; j++) {
- this.connectedTexture[j] = par1IconRegister
- .registerIcon(splitname[0] + ":connectedTex/" + splitname[1] + '/' + splitname[1] + '_' + j);
- }
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(IBlockAccess worldClient, int xCoord, int yCoord, int zCoord, int aSide) {
- if (!this.connectedTex) return super.getIcon(worldClient, xCoord, yCoord, zCoord, aSide);
-
- ForgeDirection dir = ForgeDirection.getOrientation(aSide);
- byte sides = 0;
- switch (dir) {
- case UP:
- case DOWN: {
- if (worldClient.getBlock(xCoord, yCoord, zCoord - 1) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord, zCoord + 1) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord - 1, yCoord, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord + 1, yCoord, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case EAST: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord, yCoord, zCoord + 1) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord, yCoord, zCoord - 1) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case WEST: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord, yCoord, zCoord - 1) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord, yCoord, zCoord + 1) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case NORTH: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord + 1, yCoord, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord - 1, yCoord, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case SOUTH: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord - 1, yCoord, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord + 1, yCoord, zCoord) instanceof BW_GlasBlocks)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case UNKNOWN:
- default: {
- break;
- }
- }
- return this.connectedTexture[sides];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public int getRenderBlockPass() {
- return 1;
- }
-
- @Override
- public int getRenderType() {
- if (!this.fake && SideReference.Side.Client) return RendererGlasBlock.renderID;
- return 0;
- }
-
- @Override
- public boolean renderAsNormalBlock() {
- return false;
- }
-
- @Override
- protected boolean canSilkHarvest() {
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java
deleted file mode 100644
index 4ef12dc30b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.blocks;
-
-import net.minecraft.block.material.Material;
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.util.IIcon;
-import net.minecraft.world.IBlockAccess;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.renderer.RendererGlasBlock;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public class BW_GlasBlocks2 extends BW_Blocks {
-
- @SideOnly(Side.CLIENT)
- private IIcon[] connectedTexture;
-
- private final boolean connectedTex;
- private boolean fake;
- private short[][] color = new short[this.textureNames.length][3];
-
- public BW_GlasBlocks2(String name, String[] texture, CreativeTabs tabs) {
- super(name, texture, tabs, Material.glass);
- this.connectedTex = false;
- }
-
- public BW_GlasBlocks2(String name, String[] texture, short[][] color, CreativeTabs tabs, boolean connectedTex,
- boolean fake) {
- super(name, texture, tabs, Material.glass);
- this.connectedTex = connectedTex;
- this.color = color;
- this.fake = fake;
- }
-
- public short[] getColor(int meta) {
- return meta < this.texture.length ? this.color[meta] : this.color[0];
- }
-
- @Override
- public boolean isOpaqueCube() {
- return false;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public boolean shouldSideBeRendered(IBlockAccess worldClient, int xCoord, int yCoord, int zCoord, int aSide) {
- if (worldClient.getBlock(xCoord, yCoord, zCoord) instanceof BW_GlasBlocks2) return false;
- return super.shouldSideBeRendered(worldClient, xCoord, yCoord, zCoord, aSide);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(int side, int meta) {
- return meta < this.texture.length ? this.texture[meta] : this.texture[0];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerBlockIcons(IIconRegister par1IconRegister) {
- if (!this.connectedTex) {
- this.texture = new IIcon[this.textureNames.length];
- for (int i = 0; i < this.textureNames.length; i++) {
- this.texture[i] = par1IconRegister.registerIcon(this.textureNames[i]);
- }
- return;
- }
- this.texture = new IIcon[this.textureNames.length];
- this.connectedTexture = new IIcon[16];
- for (int i = 0; i < this.textureNames.length; i++) {
- this.texture[i] = par1IconRegister.registerIcon(this.textureNames[i]);
- String[] splitname = this.textureNames[0].split(":");
- for (int j = 0; j < 16; j++) {
- this.connectedTexture[j] = par1IconRegister.registerIcon(
- splitname[0] + ":connectedTex/"
- + "BoronSilicateGlassBlock"
- + '/'
- + "BoronSilicateGlassBlock"
- + '_'
- + j);
- }
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(IBlockAccess worldClient, int xCoord, int yCoord, int zCoord, int aSide) {
- if (!this.connectedTex) return super.getIcon(worldClient, xCoord, yCoord, zCoord, aSide);
-
- ForgeDirection dir = ForgeDirection.getOrientation(aSide);
- byte sides = 0;
- switch (dir) {
- case UP:
- case DOWN: {
- if (worldClient.getBlock(xCoord, yCoord, zCoord - 1) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord, zCoord + 1) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord - 1, yCoord, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord + 1, yCoord, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case EAST: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord, yCoord, zCoord + 1) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord, yCoord, zCoord - 1) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case WEST: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord, yCoord, zCoord - 1) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord, yCoord, zCoord + 1) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case NORTH: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord + 1, yCoord, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord - 1, yCoord, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case SOUTH: {
- if (worldClient.getBlock(xCoord, yCoord + 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0001);
- if (worldClient.getBlock(xCoord, yCoord - 1, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0010);
- if (worldClient.getBlock(xCoord - 1, yCoord, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b0100);
- if (worldClient.getBlock(xCoord + 1, yCoord, zCoord) instanceof BW_GlasBlocks2)
- sides = (byte) (sides | 0b1000);
- break;
- }
- case UNKNOWN:
- default: {
- break;
- }
- }
- return this.connectedTexture[sides];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public int getRenderBlockPass() {
- return 1;
- }
-
- @Override
- public int getRenderType() {
- if (!this.fake && SideReference.Side.Client) return RendererGlasBlock.renderID;
- return 0;
- }
-
- @Override
- public boolean renderAsNormalBlock() {
- return false;
- }
-
- @Override
- protected boolean canSilkHarvest() {
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java
deleted file mode 100644
index fb8e163ad1..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.blocks;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockContainer;
-import net.minecraft.block.material.Material;
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.EnumCreatureType;
-import net.minecraft.entity.item.EntityItem;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.MathHelper;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-import net.minecraftforge.fluids.IFluidContainerItem;
-
-import com.github.bartimaeusnek.bartworks.API.ITileAddsInformation;
-import com.github.bartimaeusnek.bartworks.API.ITileDropsContent;
-import com.github.bartimaeusnek.bartworks.API.ITileHasDifferentTextureSides;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BW_TileEntity_HeatedWaterPump;
-import com.gtnewhorizons.modularui.api.UIInfos;
-import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.api.tile.IWrenchable;
-import ic2.core.IC2;
-import ic2.core.IHasGui;
-
-public class BW_TileEntityContainer extends BlockContainer implements ITileAddsInformation {
-
- protected Class<? extends TileEntity> tileEntity;
-
- public BW_TileEntityContainer(Material p_i45386_1_, Class<? extends TileEntity> tileEntity, String blockName) {
- super(p_i45386_1_);
- this.tileEntity = tileEntity;
- this.setHardness(15.0F);
- this.setResistance(30.0F);
- this.setCreativeTab(MainMod.BWT);
- this.setBlockName(blockName);
- this.setBlockTextureName(MainMod.MOD_ID + ":" + blockName);
- }
-
- @Override
- public boolean onBlockActivated(World worldObj, int x, int y, int z, EntityPlayer player, int side, float subX,
- float subY, float subZ) {
- if (worldObj.isRemote) {
- return false;
- }
- TileEntity tile = worldObj.getTileEntity(x, y, z);
- if (tile instanceof BW_TileEntity_HeatedWaterPump) {
- if (player.getHeldItem() != null && (player.getHeldItem()
- .getItem()
- .equals(Items.bucket)
- || player.getHeldItem()
- .getItem() instanceof IFluidContainerItem)
- && ((BW_TileEntity_HeatedWaterPump) tile).drain(1000, false) != null)
- if (player.getHeldItem()
- .getItem()
- .equals(Items.bucket) && ((BW_TileEntity_HeatedWaterPump) tile).drain(1000, false).amount == 1000) {
- ((BW_TileEntity_HeatedWaterPump) tile).drain(1000, true);
- player.getHeldItem().stackSize--;
- if (player.getHeldItem().stackSize <= 0)
- player.inventory.setInventorySlotContents(player.inventory.currentItem, null);
- player.inventory.addItemStackToInventory(new ItemStack(Items.water_bucket));
- return true;
- }
- }
- if (!player.isSneaking()) {
- if (tile instanceof IHasGui) {
- return worldObj.isRemote || IC2.platform.launchGui(player, (IHasGui) tile);
- }
- if (tile instanceof ITileWithModularUI) {
- if (!worldObj.isRemote) {
- UIInfos.TILE_MODULAR_UI.open(player, worldObj, x, y, z);
- }
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
- TileEntity tile = world.getTileEntity(x, y, z);
- if (tile instanceof IWrenchable tile2 && itemStack != null) {
- int meta = itemStack.getItemDamage();
- world.setBlockMetadataWithNotify(x, y, z, meta, 2);
- if (entity != null) {
- int face = MathHelper.floor_double(entity.rotationYaw * 4.0f / 360.0f + 0.5) & 0x3;
- switch (face) {
- case 0:
- tile2.setFacing((short) 2);
- break;
- case 1:
- tile2.setFacing((short) 5);
- break;
- case 2:
- tile2.setFacing((short) 3);
- break;
- case 3:
- tile2.setFacing((short) 4);
- break;
- }
- }
- }
- }
-
- @Override
- public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
- TileEntity t = world.getTileEntity(x, y, z);
- if (t instanceof ITileDropsContent) {
- int[] dropSlots = ((ITileDropsContent) t).getDropSlots();
- for (int dropSlot : dropSlots) {
- if (((ITileDropsContent) t).getStackInSlot(dropSlot) != null) world.spawnEntityInWorld(
- new EntityItem(world, x, y, z, ((BW_TileEntity_HeatedWaterPump) t).getStackInSlot(dropSlot)));
- }
- }
- super.breakBlock(world, x, y, z, block, meta);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(int side, int meta) {
- if (!ITileHasDifferentTextureSides.class.isAssignableFrom(this.tileEntity)) return super.getIcon(side, meta);
- try {
- return ((ITileHasDifferentTextureSides) this.tileEntity.getConstructor()
- .newInstance()).getTextureForSide(side, meta);
- } catch (Exception e) {
- e.printStackTrace();
- return super.getIcon(side, meta);
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerBlockIcons(IIconRegister par1IconRegister) {
- if (ITileHasDifferentTextureSides.class.isAssignableFrom(this.tileEntity)) {
- try {
- ((ITileHasDifferentTextureSides) this.tileEntity.getConstructor()
- .newInstance()).registerBlockIcons(par1IconRegister);
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else super.registerBlockIcons(par1IconRegister);
- }
-
- @Override
- public TileEntity createNewTileEntity(World worldIn, int meta) {
- try {
- return this.tileEntity.getConstructor()
- .newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
- @Override
- public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
- return false;
- }
-
- @Override
- public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
- return false;
- }
-
- @Override
- public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
- return false;
- }
-
- @Override
- public String[] getInfoData() {
- if (ITileAddsInformation.class.isAssignableFrom(this.tileEntity)) {
- try {
- return ((ITileAddsInformation) this.tileEntity.getConstructor()
- .newInstance()).getInfoData();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return new String[0];
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java
deleted file mode 100644
index 0d1d9fd20b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.blocks;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.world.World;
-
-import gregtech.api.GregTech_API;
-
-public class BW_TileEntityContainer_MachineBlock extends BW_TileEntityContainer {
-
- public BW_TileEntityContainer_MachineBlock(Material p_i45386_1_, Class<? extends TileEntity> tileEntity,
- String blockName) {
- super(p_i45386_1_, tileEntity, blockName);
- GregTech_API.registerMachineBlock(this, -1);
- }
-
- @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, aWorld.getBlockMetadata(aX, aY, aZ))) {
- GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java
deleted file mode 100644
index 852d8370ad..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.blocks;
-
-import java.util.List;
-
-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.Entity;
-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.util.IIcon;
-import net.minecraft.util.MathHelper;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.gtnewhorizons.modularui.api.UIInfos;
-import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.api.tile.IWrenchable;
-import ic2.core.IC2;
-import ic2.core.IHasGui;
-
-public class BW_TileEntityContainer_Multiple extends BlockContainer {
-
- protected final String[] textureNames;
- protected final String name;
- protected final Class<? extends TileEntity>[] tileEntityArray;
-
- @SideOnly(Side.CLIENT)
- protected IIcon[] texture;
-
- public BW_TileEntityContainer_Multiple(Material p_i45386_1_, Class<? extends TileEntity>[] tileEntity,
- String blockName, String[] textureNames, CreativeTabs tabs) {
- super(p_i45386_1_);
- this.setHardness(15.0F);
- this.setResistance(30.0F);
- this.tileEntityArray = tileEntity;
- this.name = blockName;
- this.textureNames = textureNames;
- this.setCreativeTab(tabs);
- this.setBlockName(blockName);
- this.setBlockTextureName(MainMod.MOD_ID + ":" + blockName);
- }
-
- @Override
- public boolean onBlockActivated(World worldObj, int x, int y, int z, EntityPlayer player, int side, float subX,
- float subY, float subZ) {
- if (worldObj.isRemote) {
- return true;
- }
- if (!player.isSneaking()) {
- TileEntity tile = worldObj.getTileEntity(x, y, z);
- if (tile instanceof IHasGui) {
- return worldObj.isRemote || IC2.platform.launchGui(player, (IHasGui) tile);
- }
- if (tile instanceof ITileWithModularUI && !worldObj.isRemote) {
- UIInfos.TILE_MODULAR_UI.open(player, worldObj, x, y, z);
- }
- }
-
- return false;
- }
-
- @Override
- public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
- TileEntity tile = world.getTileEntity(x, y, z);
- if (tile instanceof IWrenchable tile2 && itemStack != null) {
- int meta = itemStack.getItemDamage();
- world.setBlockMetadataWithNotify(x, y, z, meta, 2);
- if (entity != null) {
- int face = MathHelper.floor_double(entity.rotationYaw * 4.0f / 360.0f + 0.5) & 0x3;
- switch (face) {
- case 0:
- tile2.setFacing((short) 2);
- break;
- case 1:
- tile2.setFacing((short) 5);
- break;
- case 2:
- tile2.setFacing((short) 3);
- break;
- case 3:
- tile2.setFacing((short) 4);
- break;
- }
- }
- }
- }
-
- @Override
- public int damageDropped(int meta) {
- return meta;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) {
- for (int i = 0; i < this.textureNames.length; i++) {
- list.add(new ItemStack(item, 1, i));
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(int side, int meta) {
- return meta < this.texture.length ? this.texture[meta] : this.texture[0];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerBlockIcons(IIconRegister par1IconRegister) {
- this.texture = new IIcon[this.textureNames.length];
- for (int i = 0; i < this.textureNames.length; i++) {
- this.texture[i] = par1IconRegister.registerIcon(this.textureNames[i]);
- }
- }
-
- @Override
- public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
- return false;
- }
-
- @Override
- public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
- return false;
- }
-
- @Override
- public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
- return false;
- }
-
- @Override
- public TileEntity createNewTileEntity(World worldIn, int meta) {
- try {
- return this.tileEntityArray[meta].getConstructor()
- .newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java
deleted file mode 100644
index a5ad7625f9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.blocks;
-
-import net.minecraft.block.ITileEntityProvider;
-import net.minecraft.block.material.Material;
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.IIcon;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-import net.minecraftforge.fluids.BlockFluidBase;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BWTileEntityDimIDBridge;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public class BioFluidBlock extends BlockFluidBase implements ITileEntityProvider {
-
- public BioFluidBlock() {
- super(FluidLoader.ff, Material.water);
- this.setBlockName("BioFluidBlock");
- // this.setCreativeTab(MainMod.BioTab);
- this.textureName = "gregtech:fluids/fluid.molten.autogenerated";
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerBlockIcons(IIconRegister reg) {
- FluidLoader.autogenIIcon = this.blockIcon = reg.registerIcon(this.getTextureName());
- }
-
- @Override
- public int getQuantaValue(IBlockAccess world, int x, int y, int z) {
- return 0;
- }
-
- @Override
- public boolean canCollideCheck(int meta, boolean fullHit) {
- return false;
- }
-
- @Override
- public int getMaxRenderHeightMeta() {
- return 0;
- }
-
- @Override
- public int getRenderType() {
- return FluidLoader.renderID;
- }
-
- @Override
- public FluidStack drain(World world, int x, int y, int z, boolean doDrain) {
- return null;
- }
-
- @Override
- public boolean canDrain(World world, int x, int y, int z) {
- return false;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) {
- return FluidLoader.autogenIIcon;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(int side, int meta) {
- return FluidLoader.autogenIIcon;
- }
-
- @Override
- public TileEntity createNewTileEntity(World worldIn, int meta) {
- return new BWTileEntityDimIDBridge();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java
deleted file mode 100644
index 0434a5d974..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.commands;
-
-import java.lang.reflect.Field;
-
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-public class ChangeConfig extends CommandBase {
-
- @Override
- public String getCommandName() {
- return "bwcfg";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "bwcfg <NameOfVariable> <newValue>";
- }
-
- @Override
- @SuppressWarnings("rawtypes")
- public void processCommand(ICommandSender sender, String[] args) {
- try {
- Field f = ConfigHandler.class.getField(args[0]);
- Class c = f.getType();
- if (c.equals(int.class)) {
- int l;
- try {
- l = Integer.parseInt(args[1]);
- } catch (NumberFormatException e) {
- sender.addChatMessage(new ChatComponentText("you need to enter a number!"));
- return;
- }
- f.setInt(null, l);
- } else if (c.equals(long.class)) {
- long l;
- try {
- l = Long.parseLong(args[1]);
- } catch (NumberFormatException e) {
- sender.addChatMessage(new ChatComponentText("you need to enter a number!"));
- return;
- }
- f.setLong(null, l);
- } else if (c.equals(boolean.class)) {
- if ("true".equalsIgnoreCase(args[1]) || "1".equalsIgnoreCase(args[1])) f.setBoolean(null, true);
- else if ("false".equalsIgnoreCase(args[1]) || "0".equalsIgnoreCase(args[1])) f.setBoolean(null, false);
- else {
- sender.addChatMessage(new ChatComponentText("booleans need to be set to true or false"));
- }
- }
- sender.addChatMessage(new ChatComponentText("Set " + args[0] + " to " + args[1]));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java
deleted file mode 100644
index 7afe07beb0..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.commands;
-
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
-
-import com.github.bartimaeusnek.bartworks.ASM.BWCoreStaticReplacementMethodes;
-
-public class ClearCraftingCache extends CommandBase {
-
- @Override
- public String getCommandName() {
- return "bwclr";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "bwclr";
- }
-
- @Override
- public void processCommand(ICommandSender sender, String[] args) {
- BWCoreStaticReplacementMethodes.clearRecentlyUsedRecipes();
- sender.addChatMessage(new ChatComponentText("Recipe Cache cleared "));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java
deleted file mode 100644
index 341044c498..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.commands;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
-
-public class GetWorkingDirectory extends CommandBase {
-
- @Override
- public String getCommandName() {
- return "bwgwd";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "bwgwd";
- }
-
- @Override
- public void processCommand(ICommandSender sender, String[] args) {
- sender.addChatMessage(new ChatComponentText(Minecraft.getMinecraft().mcDataDir.getAbsolutePath()));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java
deleted file mode 100644
index dcd7caee97..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.commands;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.item.crafting.CraftingManager;
-
-public class PrintRecipeListToFile extends CommandBase {
-
- @Override
- public String getCommandName() {
- return "prltf";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "prltf <FilePath>";
- }
-
- @Override
- public void processCommand(ICommandSender sender, String[] args) {
- File file = new File(args[0]);
- try {
-
- BufferedWriter fw = new BufferedWriter(new FileWriter(file));
- CraftingManager.getInstance()
- .getRecipeList()
- .forEach(e -> {
- try {
- fw.write(
- e.toString() + " = "
- + e.getRecipeOutput()
- .getDisplayName()
- + "\n");
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- });
- fw.flush();
- fw.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java
deleted file mode 100644
index 5b76d6a163..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.commands;
-
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
-
-public class RunGC extends CommandBase {
-
- @Override
- public String getCommandName() {
- return "bwgc";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "bwgc";
- }
-
- @Override
- public void processCommand(ICommandSender sender, String[] args) {
- Runtime.getRuntime()
- .gc();
- sender.addChatMessage(new ChatComponentText("Ran GC!"));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java
deleted file mode 100644
index 5b37a98e7e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.commands;
-
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-
-import com.github.bartimaeusnek.bartworks.system.worldgen.MapGenRuins;
-
-public class SummonRuin extends CommandBase {
-
- @Override
- public String getCommandName() {
- return "SummonRuin";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "SummonRuin <x> <z>";
- }
-
- @Override
- public void processCommand(ICommandSender iCommandSender, String[] args) {
- try {
- new MapGenRuins.RuinsBase().generate(
- iCommandSender.getEntityWorld(),
- iCommandSender.getEntityWorld().rand,
- Integer.parseInt(args[0]),
- 256,
- Integer.parseInt(args[1]));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java
deleted file mode 100644
index 7c5a515b86..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.configs;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import net.minecraftforge.common.config.Configuration;
-
-import com.github.bartimaeusnek.bartworks.API.API_ConfigValues;
-import com.github.bartimaeusnek.bartworks.ASM.BWCoreTransformer;
-
-public class ConfigHandler {
-
- private static final int IDU = 10 * 8 + 5;
- public static Configuration c;
-
- public static int IDOffset = 12600;
- public static int megaMachinesMax = 256;
- public static int mbWaterperSec = 150;
- public static int ross128BID = -64;
- public static int ross128BAID = -63;
- public static int ross128btier = 3;
- public static int ross128batier = 3;
- public static int landerType = 3;
- public static int ross128bRuinChance = 512;
- public static int creativeScannerID;
- public static int bioVatMaxParallelBonus = 1000;
- public static int cutoffTier = 5;
- public static int[][][] metasForTiers;
-
- public static long energyPerCell = 1000000L;
-
- public static boolean newStuff = true;
- public static boolean BioLab = true;
- public static boolean Ross128Enabled = true;
-
- public static boolean disableExtraGassesForEBF;
- public static boolean disableMagicalForest;
- public static boolean DEHPDirectSteam;
- public static boolean teslastaff;
- public static boolean classicMode;
-
- public static boolean GTppLogDisabler;
- public static boolean tooltips = true;
- public static boolean sharedItemStackTooltip = true;
- public static boolean[] enabledPatches;
-
- public static byte maxTierRoss;
-
- public static boolean disableBoltedBlocksCasing = false;
- public static boolean disableReboltedBlocksCasing = false;
-
- public static int pollutionHeatedWaterPumpSecond = 5;
- public static int basePollutionMBFSecond = 400;
-
- public static Set<String> voidMinerBlacklist = Collections.unmodifiableSet(new HashSet<>());
-
- public static boolean disablePistonInEIC = false;
-
- private static final int[][] METAFORTIERS_ENERGY = { { 100, 101, 102, 105 }, { 1110, 1115, 1120, 1127 },
- { 1111, 12726, 1116, 1121, 1128 }, { 1112, 12727, 1117, 1122, 1129 }, { 12728, 1190, 1130, 12685 },
- { 1191, 1174, 695, 12686 }, };
- private static final int[][] METAFORTIERS_BUFFER = { { 5133, 5123 }, { 161, 171, 181, 191 }, { 162, 172, 182, 192 },
- { 163, 173, 183, 193 }, { 164, 174, 184, 194 }, { 165, 175, 185, 195 }, };
- private static final int[][] METAFORTIERS_CABLE = { { 5133, 5123 }, { 1210, 1230, 1250, 1270, 1290 },
- { 1310, 1330, 1350, 1370, 1390 }, { 1410, 1430, 1450, 1470, 1490 }, { 1510, 1530, 1550, 1570, 1590 },
- { 1650, 1670, 1690 }, };
- private static final int[][] METAFORTIERS_MACHINE = {
- { 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 119 },
- { 201, 211, 221, 231, 241, 251, 261, 271, 281, 291, 301, 311, 321, 331, 341, 351, 361, 371, 381, 391, 401, 411,
- 421, 431, 441, 451, 461, 471, 481, 491, 501, 511, 521, 531, 541, 551, 561, 571, 581, 591, 601, 611, 621,
- 631, 641, 651, 661, 671 },
- { 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 302, 312, 322, 332, 342, 352, 362, 372, 382, 392, 402, 412,
- 422, 432, 442, 452, 462, 472, 482, 492, 502, 512, 522, 532, 542, 552, 562, 572, 582, 592, 602, 612, 622,
- 632, 642, 652, 662, 672 },
- { 203, 213, 223, 233, 243, 253, 263, 273, 283, 293, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 403, 413,
- 423, 433, 443, 453, 463, 473, 483, 493, 503, 513, 523, 533, 543, 553, 563, 573, 583, 593, 603, 613, 623,
- 633, 643, 653, 663, 673 },
- { 204, 214, 224, 234, 244, 254, 264, 274, 284, 294, 304, 314, 324, 334, 344, 354, 364, 374, 384, 394, 404, 414,
- 424, 434, 444, 454, 464, 474, 484, 494, 504, 514, 524, 534, 544, 554, 564, 574, 584, 594, 604, 614, 624,
- 634, 644, 654, 664, 674 },
- { 205, 215, 225, 235, 245, 255, 265, 275, 285, 295, 305, 315, 325, 335, 345, 355, 365, 375, 385, 395, 405, 415,
- 425, 435, 445, 455, 465, 475, 485, 495, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 605, 615, 625,
- 635, 645, 655, 665, 675 }, };
- private static int[][][] defaultMetasForTiers = { METAFORTIERS_ENERGY, METAFORTIERS_BUFFER, METAFORTIERS_CABLE,
- METAFORTIERS_MACHINE };
- private static final String[] VOLTAGE_NAMES = { "High Pressure Steam", "Low Voltage", "Medium Voltage",
- "High Voltage", "Extreme Voltage", "Insane Voltage", "Ludicrous Voltage", "ZPM Voltage", "Ultimate Voltage",
- "Ultimate High Voltage", "Ultimate Extreme Voltage", "Ultimate Insane Voltage", "Ultimate Mega Voltage",
- "Ultimate Extended Mega Voltage", "Overpowered Voltage", "Maximum Voltage" };
- private static final String[] names = { "Generators", "Buffers", "Cables", "Machines" };
-
- public ConfigHandler(Configuration C) {
- ConfigHandler.c = C;
- ConfigHandler.classicMode = ConfigHandler.c
- .get(
- "System",
- "Enable Classic Mode",
- false,
- "Enables the classic Mode (all recipes in normal machines are doable in MV")
- .getBoolean(false);
- ConfigHandler.creativeScannerID = ConfigHandler.c
- .get("System", "Creative Debug Scanner", 0, "ID for the Creative Debug Scanner Block")
- .getInt(0);
-
- ConfigHandler.tooltips = ConfigHandler.c
- .get("System", "BartWorksToolTips", true, "If you wish to enable extra tooltips")
- .getBoolean(true);
- ConfigHandler.sharedItemStackTooltip = ConfigHandler.c
- .get(
- "System",
- "BartWorksSharedItemStackToolTips",
- true,
- "If you wish to enable \"Shared Item Stack\" tooltips")
- .getBoolean(true);
-
- ConfigHandler.IDOffset = ConfigHandler.c
- .get(
- "System",
- "ID Offset",
- 12600,
- "ID Offset for this mod. This Mod uses " + ConfigHandler.IDU
- + " IDs. DO NOT CHANGE IF YOU DONT KNOW WHAT THIS IS")
- .getInt(12600);
- ConfigHandler.teslastaff = ConfigHandler.c
- .get(
- "System",
- "Enable Teslastaff",
- false,
- "Enables the Teslastaff, an Item used to destroy Electric Armors")
- .getBoolean(false);
- ConfigHandler.BioLab = !ConfigHandler.c.get(
- "System",
- "Disable BioLab",
- false,
- "This switch disables the BioLab, BioVat etc. If you use GT5.08 or equivalent, this needs to be turned off!")
- .getBoolean(false);
- ConfigHandler.cutoffTier = ConfigHandler.c
- .get(
- "System",
- "Tier to nerf circuits",
- 5,
- "This switch sets the lowest unnerfed Circuit Recipe Tier. -1 to disable it completely.",
- -1,
- VOLTAGE_NAMES.length)
- .getInt(5);
- ConfigHandler.cutoffTier = ConfigHandler.cutoffTier == -1 ? VOLTAGE_NAMES.length : ConfigHandler.cutoffTier;
- ConfigHandler.disableExtraGassesForEBF = ConfigHandler.c
- .get(
- "System",
- "Disable Extra Gases for EBF",
- false,
- "This switch disables extra gas recipes for the EBF, i.e. Xenon instead of Nitrogen")
- .getBoolean(false);
- ConfigHandler.disableBoltedBlocksCasing = ConfigHandler.c
- .get("System", "Disable Bolted Casings", false, "This switch disable the generation of bolted casings")
- .getBoolean(false);
- ConfigHandler.disableReboltedBlocksCasing = ConfigHandler.c
- .get("System", "Disable Rebolted Casings", false, "This switch disable the generation of rebolted casings")
- .getBoolean(false);
-
- ConfigHandler.mbWaterperSec = ConfigHandler.c.get("Singleblocks", "mL Water per Sec for the StirlingPump", 150)
- .getInt(150);
-
- ConfigHandler.energyPerCell = ConfigHandler.c
- .get(
- "Multiblocks",
- "energyPerLESUCell",
- 1000000,
- "This will set Up the Energy per LESU Cell",
- 1000000,
- Integer.MAX_VALUE)
- .getInt(1000000);
- ConfigHandler.DEHPDirectSteam = ConfigHandler.c.get(
- "Multiblocks",
- "DEHP Direct Steam Mode",
- false,
- "This switch enables the Direct Steam Mode of the DEHP. If enabled it will take in Waterand output steam. If disabled it will Input IC2Coolant and output hot coolant")
- .getBoolean(false);
- ConfigHandler.megaMachinesMax = ConfigHandler.c
- .get(
- "Multiblocks",
- "Mega Machines Maximum Recipes per Operation",
- 256,
- "This changes the Maximum Recipes per Operation to the specified Valure")
- .getInt(256);
- ConfigHandler.bioVatMaxParallelBonus = ConfigHandler.c
- .get(
- "Multiblocks",
- "BioVat Maximum Bonus on Recipes",
- 1000,
- "This are the maximum parallel Operations the BioVat can do, when the output is half full.")
- .getInt(1000);
- ConfigHandler.voidMinerBlacklist = Collections.unmodifiableSet(
- new HashSet<>(
- Arrays.asList(
- ConfigHandler.c.get(
- "Multiblocks",
- "Void Miner Blacklist",
- new String[0],
- "This is a blacklist for the Void Miner, blacklisted ores will not enter the drop prize pool. Please fill in the Unique Identifier of Ore and connect Damage with a colon, For example: gregtech:gt.blockores:32")
- .getStringList())));
- ConfigHandler.disablePistonInEIC = ConfigHandler.c
- .get(
- "Multiblocks",
- "Disable Electric Implosion Compressor piston",
- false,
- "This switch completely disables piston animation in Electric Implosion Compressor multiblock")
- .getBoolean(false);
-
- ConfigHandler.pollutionHeatedWaterPumpSecond = ConfigHandler.c
- .get(
- "Pollution",
- "Pollution produced per second by the water pump",
- ConfigHandler.pollutionHeatedWaterPumpSecond,
- "How much should the Simple Stirling Water Pump produce pollution per second")
- .getInt(ConfigHandler.pollutionHeatedWaterPumpSecond);
- ConfigHandler.basePollutionMBFSecond = ConfigHandler.c.get(
- "Pollution",
- "Pollution produced per tick by the MBF per ingot",
- ConfigHandler.basePollutionMBFSecond,
- "How much should the MBF produce pollution per tick per ingot. Then it'll be multiplied by the amount of ingots done in parallel")
- .getInt(ConfigHandler.basePollutionMBFSecond);
-
- if (ConfigHandler.IDOffset == 0) {
- ConfigHandler.IDOffset = 12600;
- ConfigHandler.c
- .get(
- "System",
- "ID Offset",
- 12600,
- "ID Offset for this mod. This Mod uses " + ConfigHandler.IDU
- + " IDs. DO NOT CHANGE IF YOU DONT KNOW WHAT THIS IS")
- .set(12600);
- }
-
- ConfigHandler.GTppLogDisabler = ConfigHandler.c
- .get("System", "Disable GT++ Logging", false, "Enables or Disables GT++ Logging.")
- .getBoolean(false);
- API_ConfigValues.debugLog = ConfigHandler.c
- .get("System", "Enable Debug Log", false, "Enables or Disables the debug log.")
- .getBoolean(false);
-
- for (int i = 0; i < BWCoreTransformer.CLASSESBEINGTRANSFORMED.length; i++)
- BWCoreTransformer.shouldTransform[i] = ConfigHandler.c
- .get(
- "ASM fixes",
- BWCoreTransformer.DESCRIPTIONFORCONFIG[i] + " in class: "
- + BWCoreTransformer.CLASSESBEINGTRANSFORMED[i],
- true)
- .getBoolean(true);
-
- ConfigHandler.enabledPatches = new boolean[BWCoreTransformer.shouldTransform.length];
- ConfigHandler.enabledPatches = Arrays
- .copyOf(BWCoreTransformer.shouldTransform, BWCoreTransformer.shouldTransform.length);
- ConfigHandler.ross128BID = ConfigHandler.c
- .get("CrossMod Interactions", "DimID - Ross128b", -64, "The Dim ID for Ross128b")
- .getInt(-64);
- ConfigHandler.ross128BAID = ConfigHandler.c
- .get("CrossMod Interactions", "DimID - Ross128ba", -63, "The Dim ID for Ross128ba (Ross128b's Moon)")
- .getInt(-63);
- ConfigHandler.ross128btier = ConfigHandler.c
- .get("CrossMod Interactions", "Rocket Tier - Ross128b", 3, "The Rocket Tier for Ross128b")
- .getInt(3);
- ConfigHandler.ross128batier = ConfigHandler.c
- .get("CrossMod Interactions", "Rocket Tier - Ross128ba", 3, "The Rocket Tier for Ross128a")
- .getInt(3);
- ConfigHandler.ross128bRuinChance = ConfigHandler.c
- .get("CrossMod Interactions", "Ruin Chance - Ross128b", 512, "Higher Values mean lesser Ruins.")
- .getInt(512);
- ConfigHandler.Ross128Enabled = ConfigHandler.c
- .get(
- "CrossMod Interactions",
- "Galacticraft - Activate Ross128 System",
- true,
- "If the Ross128 System should be activated, DO NOT CHANGE AFTER WORLD GENERATION")
- .getBoolean(true);
- ConfigHandler.landerType = ConfigHandler.c
- .get("CrossMod Interactions", "LanderType", 3, "1 = Moon Lander, 2 = Landing Balloons, 3 = Asteroid Lander")
- .getInt(3);
- ConfigHandler.disableMagicalForest = ConfigHandler.c
- .get(
- "CrossMod Interactions",
- "Disable Magical Forest - Ross128b",
- false,
- "True disables the magical Forest Biome on Ross for more performance during World generation.")
- .getBoolean(false);
-
- ConfigHandler.maxTierRoss = (byte) ConfigHandler.c
- .get("Ross Ruin Metas", "A_Ruin Machine Tiers", 6, "", 0, VOLTAGE_NAMES.length)
- .getInt(6);
- ConfigHandler.metasForTiers = new int[4][maxTierRoss][];
-
- for (int i = 0; i < 4; i++) {
- if (maxTierRoss > ConfigHandler.defaultMetasForTiers[i].length)
- ConfigHandler.defaultMetasForTiers[i] = new int[maxTierRoss][0];
- for (int j = 0; j < maxTierRoss; j++) ConfigHandler.metasForTiers[i][j] = ConfigHandler.c
- .get(
- "Ross Ruin Metas",
- j + "_Ruin " + names[i] + " Tier " + VOLTAGE_NAMES[j],
- ConfigHandler.defaultMetasForTiers[i][j])
- .getIntList();
- }
-
- ConfigHandler.setUpComments();
-
- if (ConfigHandler.c.hasChanged()) ConfigHandler.c.save();
- }
-
- private static void setUpComments() {
- ConfigHandler.c.addCustomCategoryComment("ASM fixes", "Disable ASM fixes here.");
- ConfigHandler.c.addCustomCategoryComment("Singleblocks", "Singleblock Options can be set here.");
- ConfigHandler.c.addCustomCategoryComment("Multiblocks", "Multiblock Options can be set here.");
- ConfigHandler.c.addCustomCategoryComment("System", "Different System Settings can be set here.");
- ConfigHandler.c.addCustomCategoryComment(
- "CrossMod Interactions",
- "CrossMod Interaction Settings can be set here. For Underground Fluid settings change the Gregtech.cfg!");
- ConfigHandler.c.addCustomCategoryComment("Ross Ruin Metas", "Ruin Metas and Tiers can be set here.");
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java
deleted file mode 100644
index f512e778bc..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import java.util.Arrays;
-import java.util.List;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.ITileEntityProvider;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemBlock;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
-import com.github.bartimaeusnek.bartworks.API.ITileAddsInformation;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.util.GT_LanguageManager;
-
-public class BW_ItemBlocks extends ItemBlock {
-
- private final String mNoMobsToolTip = GT_LanguageManager
- .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block");
- private final String mNoTileEntityToolTip = GT_LanguageManager
- .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!");
-
- public BW_ItemBlocks(Block par1) {
- super(par1);
- this.setMaxDamage(0);
- this.setHasSubtypes(true);
- this.setCreativeTab(MainMod.GT2);
- }
-
- @Override
- public int getMetadata(int aMeta) {
- return aMeta;
- }
-
- @Override
- public String getUnlocalizedName(ItemStack aStack) {
- return this.field_150939_a.getUnlocalizedName() + "." + this.getDamage(aStack);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
- byte tier = BorosilicateGlass.getTier(this.field_150939_a, aStack.getItemDamage());
- if (tier >= 0) {
- aList.add(
- StatCollector.translateToLocal("tooltip.glas.0.name") + " "
- + BW_ColorUtil.getColorForTier(tier)
- + GT_Values.VN[tier]);
- }
- if (this.field_150939_a instanceof ITileAddsInformation) {
- aList.addAll(Arrays.asList(((ITileAddsInformation) this.field_150939_a).getInfoData()));
- }
- aList.add(this.mNoMobsToolTip);
- if (!(this.field_150939_a instanceof ITileEntityProvider)) aList.add(this.mNoTileEntityToolTip);
-
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(ItemStack stack, int pass) {
- return this.field_150939_a.getIcon(0, stack.getItemDamage());
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
- return this.getIcon(stack, renderPass);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) {
- return this.field_150939_a.getIcon(0, p_77618_2_);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java
deleted file mode 100644
index 0b589bf53a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import java.util.List;
-
-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.ChatComponentText;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.core.WorldData;
-
-public class BW_SimpleWindMeter extends Item {
-
- public BW_SimpleWindMeter() {
- this.maxStackSize = 1;
- this.setMaxDamage(15);
- this.setCreativeTab(MainMod.BWT);
- this.hasSubtypes = false;
- this.setUnlocalizedName("BW_SimpleWindMeter");
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister register) {
- this.itemIcon = register.registerIcon(MainMod.MOD_ID + ":BW_SimpleWindMeter");
- }
-
- @Override
- public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List<String> list, boolean p_77624_4_) {
- super.addInformation(itemStack, entityPlayer, list, p_77624_4_);
- list.add(StatCollector.translateToLocal("tooltip.windmeter.0.name"));
- list.add(
- StatCollector.translateToLocal("tooltip.windmeter.1.name") + " "
- + (this.getMaxDamage() - this.getDamage(itemStack))
- + "/"
- + this.getMaxDamage());
- list.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer entityPlayer) {
- if (entityPlayer.worldObj.isRemote || world == null
- || WorldData.get(world) == null
- || WorldData.get(world).windSim == null) return itemStack;
-
- float windStrength = (float) WorldData.get(world).windSim.getWindAt(entityPlayer.posY);
- String windS = windStrength < 1f ? StatCollector.translateToLocal("tooltip.windmeter.2.name")
- : windStrength < 10f ? StatCollector.translateToLocal("tooltip.windmeter.3.name")
- : windStrength < 20f ? StatCollector.translateToLocal("tooltip.windmeter.4.name")
- : windStrength < 30f ? StatCollector.translateToLocal("tooltip.windmeter.5.name")
- : windStrength < 50f ? StatCollector.translateToLocal("tooltip.windmeter.6.name")
- : StatCollector.translateToLocal("tooltip.windmeter.7.name");
- entityPlayer.addChatMessage(
- new ChatComponentText(StatCollector.translateToLocal("tooltip.windmeter.8.name") + " " + windS + "."));
- itemStack.damageItem(1, entityPlayer);
- return itemStack;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java
deleted file mode 100644
index f58ae8d6e7..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import static ic2.api.item.IKineticRotor.GearboxType.WATER;
-import static ic2.api.item.IKineticRotor.GearboxType.WIND;
-
-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.nbt.NBTTagCompound;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.api.item.IKineticRotor;
-import ic2.core.block.kineticgenerator.gui.GuiWaterKineticGenerator;
-import ic2.core.block.kineticgenerator.gui.GuiWindKineticGenerator;
-import ic2.core.util.StackUtil;
-
-public class BW_Stonage_Rotors extends Item implements IKineticRotor {
-
- private final int[] DiaMinMax = new int[3];
- private final float eff;
- private final IKineticRotor.GearboxType type;
- private final ResourceLocation tex;
- private final String itemTex;
- private final int speed;
- private final float mRotor;
- private final int maxDamageEx;
- private int dura;
-
- public BW_Stonage_Rotors(int diameter, float eff, int speed, float mRotor, int min, int max, int durability,
- IKineticRotor.GearboxType type, ResourceLocation tex, String Name, String itemTex) {
- this.DiaMinMax[0] = diameter;
- this.DiaMinMax[1] = min;
- this.DiaMinMax[2] = max;
- this.eff = eff;
- this.mRotor = mRotor;
- this.speed = speed;
- this.type = type;
- this.tex = tex;
- this.setMaxDamage(30000);
- this.maxDamageEx = durability;
- this.setUnlocalizedName(Name);
- this.setCreativeTab(MainMod.BWT);
- this.itemTex = itemTex;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister iconRegister) {
- this.itemIcon = iconRegister.registerIcon(MainMod.MOD_ID + ":" + this.itemTex);
- }
-
- @Override
- public void addInformation(ItemStack itemStack, EntityPlayer player, List<String> info, boolean b) {
- info.add(
- StatCollector.translateToLocalFormatted("ic2.itemrotor.wind.info", this.DiaMinMax[1], this.DiaMinMax[2]));
- IKineticRotor.GearboxType type = null;
- if (Minecraft.getMinecraft().currentScreen instanceof GuiWaterKineticGenerator) {
- type = WATER;
- } else if (Minecraft.getMinecraft().currentScreen instanceof GuiWindKineticGenerator) {
- type = WIND;
- }
- info.add(StatCollector.translateToLocal("tooltip.rotor.0.name") + " " + this.DiaMinMax[0]);
- info.add(
- StatCollector.translateToLocal("tooltip.rotor.1.name") + " "
- + (this.getMaxDamageEx() - this.getDamageOfStack(itemStack)) / 100
- + "/"
- + this.getMaxDamageEx() / 100);
- info.add(StatCollector.translateToLocal("tooltip.rotor.2.name") + " " + this.eff);
- info.add(StatCollector.translateToLocal("tooltip.rotor.3.name") + " " + this.speed);
- info.add(StatCollector.translateToLocal("tooltip.rotor.4.name") + " " + this.mRotor);
- if (type != null) {
- info.add(StatCollector.translateToLocal("ic2.itemrotor.fitsin." + this.isAcceptedType(itemStack, type)));
- }
- info.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public int getDiameter(ItemStack itemStack) {
- return this.DiaMinMax[0];
- }
-
- @Override
- public ResourceLocation getRotorRenderTexture(ItemStack itemStack) {
- return this.tex;
- }
-
- @Override
- public float getEfficiency(ItemStack itemStack) {
- return this.eff;
- }
-
- @Override
- public int getMinWindStrength(ItemStack itemStack) {
- return this.DiaMinMax[1];
- }
-
- @Override
- public int getMaxWindStrength(ItemStack itemStack) {
- return this.DiaMinMax[2];
- }
-
- @Override
- public boolean isAcceptedType(ItemStack itemStack, IKineticRotor.GearboxType gearboxType) {
- return gearboxType.equals(this.type);
- }
-
- public int getSpeed() {
- return this.speed;
- }
-
- public float getmRotor() {
- return this.mRotor;
- }
-
- public void setDamageForStack(ItemStack stack, int advDmg) {
- NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
- nbtData.setInteger("DmgEx", advDmg);
- if (this.maxDamageEx > 0) {
- double p = (double) advDmg / (double) this.maxDamageEx;
- 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("DmgEx");
- return this.dura;
- }
-
- public int getMaxDamageEx() {
- return this.maxDamageEx;
- }
-
- public void damageItemStack(ItemStack stack, int Dmg) {
- this.setDamageForStack(stack, this.getDamageOfStack(stack) + Dmg);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java
deleted file mode 100644
index f0c746dd64..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-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.StatCollector;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.gtnewhorizons.modularui.api.ModularUITextures;
-import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
-import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
-import com.gtnewhorizons.modularui.api.math.Pos2d;
-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.internal.wrapper.BaseSlot;
-import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
-
-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.gui.modularui.GT_UIInfos;
-import gregtech.api.gui.modularui.GT_UITextures;
-import gregtech.api.items.GT_Generic_Item;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import ic2.api.item.ElectricItem;
-import ic2.api.item.IElectricItem;
-
-public class Circuit_Programmer extends GT_Generic_Item implements IElectricItem, IItemWithModularUI {
-
- private static final int COST_PER_USE = 100;
-
- public Circuit_Programmer() {
- super("BWCircuitProgrammer", "Circuit Programmer", "Programs Integrated Circuits");
- this.setMaxStackSize(1);
- this.setNoRepair();
- this.setHasSubtypes(false);
- this.setCreativeTab(MainMod.BWT);
- GregTech_API.registerCircuitProgrammer(
- s -> s.getItem() instanceof Circuit_Programmer && ElectricItem.manager.canUse(s, COST_PER_USE),
- (s, p) -> {
- ElectricItem.manager.use(s, COST_PER_USE, p);
- return s;
- });
- }
-
- @Override
- public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
- super.addInformation(aStack, aPlayer, aList, aF3_H);
- if (aStack != null && aStack.getTagCompound() != null) aList.add(
- StatCollector.translateToLocal("tooltip.cp.0.name") + " "
- + (aStack.getTagCompound()
- .getBoolean("HasChip") ? StatCollector.translateToLocal("tooltip.bw.yes.name")
- : StatCollector.translateToLocal("tooltip.bw.no.name")));
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
- if (ElectricItem.manager.use(aStack, COST_PER_USE, aPlayer)) {
- GT_UIInfos.openPlayerHeldItemUI(aPlayer);
- }
- return aStack;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List<ItemStack> itemList) {
- ItemStack itemStack = new ItemStack(this, 1);
- if (this.getChargedItem(itemStack) == this) {
- ItemStack charged = new ItemStack(this, 1);
- ElectricItem.manager.charge(charged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
- itemList.add(charged);
- }
- if (this.getEmptyItem(itemStack) == this) {
- itemList.add(new ItemStack(this, 1, this.getMaxDamage()));
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister aIconRegister) {
- this.mIcon = aIconRegister.registerIcon("bartworks:CircuitProgrammer");
- }
-
- @Override
- public int getTier(ItemStack var1) {
- return 1;
- }
-
- @Override
- public boolean canProvideEnergy(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public Item getChargedItem(ItemStack itemStack) {
- return this;
- }
-
- @Override
- public Item getEmptyItem(ItemStack itemStack) {
- return this;
- }
-
- @Override
- public double getMaxCharge(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public double getTransferLimit(ItemStack itemStack) {
- return GT_Values.V[1];
- }
-
- private static final String NBT_KEY_HAS_CHIP = "HasChip";
- private static final String NBT_KEY_CHIP_CONFIG = "ChipConfig";
-
- @Override
- public ModularWindow createWindow(UIBuildContext buildContext, ItemStack heldStack) {
- ModularWindow.Builder builder = ModularWindow.builder(256, 166);
- builder.setBackground(BW_UITextures.BACKGROUND_CIRCUIT_PROGRAMMER);
- builder.bindPlayerInventory(buildContext.getPlayer(), new Pos2d(86, 83), ModularUITextures.ITEM_SLOT);
-
- ItemStackHandler inventoryHandler = new ItemStackHandler(1) {
-
- @Override
- public int getSlotLimit(int slot) {
- return 1;
- }
- };
- SlotWidget circuitSlotWidget = new SlotWidget(new BaseSlot(inventoryHandler, 0) {
-
- @Override
- public void putStack(ItemStack stack) {
- if (Circuit_Programmer.this.isLVCircuit(stack)) {
- stack = Circuit_Programmer.this.createRealCircuit(0);
- }
- ((IItemHandlerModifiable) this.getItemHandler()).setStackInSlot(this.getSlotIndex(), stack);
- this.onSlotChanged();
- }
- });
-
- ItemStack initialStack = null;
- NBTTagCompound tag = heldStack.getTagCompound();
- if (tag != null && tag.getBoolean(NBT_KEY_HAS_CHIP)) {
- initialStack = this.createRealCircuit(tag.getByte(NBT_KEY_CHIP_CONFIG));
- }
- circuitSlotWidget.getMcSlot()
- .putStack(initialStack);
-
- builder.widget(circuitSlotWidget.setChangeListener(widget -> {
- ItemStack stack = widget.getMcSlot()
- .getStack();
- ItemStack heldItem = widget.getContext()
- .getPlayer()
- .getHeldItem();
- NBTTagCompound tag2 = heldItem.getTagCompound();
- if (tag2 == null) {
- tag2 = new NBTTagCompound();
- }
-
- if (stack != null) {
- tag2.setBoolean(NBT_KEY_HAS_CHIP, true);
- tag2.setByte(NBT_KEY_CHIP_CONFIG, (byte) stack.getItemDamage());
- } else {
- tag2.setBoolean(NBT_KEY_HAS_CHIP, false);
- }
- heldItem.setTagCompound(tag2);
- })
- .setFilter(stack -> this.isProgrammedCircuit(stack) || this.isLVCircuit(stack))
- .setBackground(ModularUITextures.ITEM_SLOT, GT_UITextures.OVERLAY_SLOT_INT_CIRCUIT)
- .setPos(122, 60));
-
- for (int i = 0; i < 24; i++) {
- final int index = i;
- builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
- if (circuitSlotWidget.getMcSlot()
- .getHasStack()
- && this.isProgrammedCircuit(
- circuitSlotWidget.getMcSlot()
- .getStack())) {
- circuitSlotWidget.getMcSlot()
- .putStack(this.createRealCircuit(index + 1));
- }
- })
- .setPos(32 + i % 12 * 18, 21 + i / 12 * 18)
- .setSize(18, 18));
- }
-
- return builder.build();
- }
-
- private ItemStack createRealCircuit(int config) {
- return ItemList.Circuit_Integrated.getWithDamage(1, config);
- }
-
- private boolean isProgrammedCircuit(ItemStack stack) {
- return stack.getItem()
- .equals(
- GT_Utility.getIntegratedCircuit(0)
- .getItem());
- }
-
- private boolean isLVCircuit(ItemStack stack) {
- return BW_Util.checkStackAndPrefix(stack)
- && OrePrefixes.circuit.equals(GT_OreDictUnificator.getAssociation(stack).mPrefix)
- && GT_OreDictUnificator.getAssociation(stack).mMaterial.mMaterial.equals(Materials.Basic);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java
deleted file mode 100644
index 37ecfc61d2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import java.util.List;
-
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.gtnewhorizons.modularui.api.ModularUITextures;
-import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
-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.internal.wrapper.BaseSlot;
-import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
-
-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;
-
-public class GT_Destructopack_Item extends GT_Generic_Item implements IItemWithModularUI {
-
- public GT_Destructopack_Item() {
- super("GT2Destructopack", "Destructopack", "Mobile Trash Bin");
- this.setMaxStackSize(1);
- this.setNoRepair();
- this.setHasSubtypes(false);
- this.setCreativeTab(MainMod.GT2);
- }
-
- @Override
- public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
- super.addInformation(aStack, aPlayer, aList, aF3_H);
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
- GT_UIInfos.openPlayerHeldItemUI(aPlayer);
- return aStack;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister aIconRegister) {
- this.mIcon = aIconRegister.registerIcon("bartworks:gt.GT2Destructopack");
- }
-
- @Override
- public ModularWindow createWindow(UIBuildContext buildContext, ItemStack heldStack) {
- ModularWindow.Builder builder = ModularWindow.builder(176, 166);
- builder.setBackground(ModularUITextures.VANILLA_BACKGROUND);
- builder.bindPlayerInventory(buildContext.getPlayer());
-
- builder.widget(new SlotWidget(new BaseSlot(new ItemStackHandler(), 0) {
-
- @Override
- public void putStack(ItemStack stack) {
- this.onSlotChanged();
- }
- }).setBackground(ModularUITextures.ITEM_SLOT, BW_UITextures.OVERLAY_SLOT_CROSS)
- .setPos(79, 16))
- .widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT)
- .setSize(17, 17)
- .setPos(152, 63));
-
- return builder.build();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java
deleted file mode 100644
index 3a132dde22..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-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.enchantment.Enchantment;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.ItemTool;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.google.common.collect.Sets;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.GT_Values;
-import ic2.api.item.ElectricItem;
-import ic2.api.item.IElectricItem;
-
-public class GT_Rockcutter_Item extends ItemTool implements IElectricItem {
-
- private static Set<Block> mineableBlocks = Sets
- .newHashSet(Blocks.stone, Blocks.cobblestone, Blocks.sand, Blocks.clay);
- private final int mCharge;
- private final int mTransfer;
- public int mTier;
-
- @SideOnly(Side.CLIENT)
- private IIcon icon;
-
- private final int multi;
-
- public GT_Rockcutter_Item(int aTier) {
- super(2 * aTier, Item.ToolMaterial.EMERALD, GT_Rockcutter_Item.mineableBlocks);
- this.mTier = aTier;
- this.multi = (int) Math.pow(10, this.mTier - 1);
- GT_Rockcutter_Item.mineableBlocks = new HashSet<>();
- this.maxStackSize = 1;
- this.mCharge = 10000 * this.multi;
- this.mTransfer = (int) GT_Values.V[this.mTier];
- this.efficiencyOnProperMaterial = 2.0f * this.mTier;
- this.setCreativeTab(MainMod.GT2);
- this.setMaxDamage(27 + 10 * this.multi);
- this.setNoRepair();
- this.setUnlocalizedName("GT_Rockcutter_Item_" + GT_Values.VN[this.mTier]);
- }
-
- @Override
- public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
- aList.add(StatCollector.translateToLocal("tooltip.bw.tier.name") + " " + GT_Values.VN[this.mTier]);
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public void onUpdate(ItemStack aStack, World worldIn, Entity entityIn, int p_77663_4_, boolean p_77663_5_) {
- if (!ElectricItem.manager.canUse(aStack, 500 * this.multi)) {
- if (aStack.isItemEnchanted()) {
- aStack.getTagCompound()
- .removeTag("ench");
- }
- } else if (!aStack.isItemEnchanted()) {
- aStack.addEnchantment(Enchantment.silkTouch, 3);
- }
- }
-
- @Override
- public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, 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_) {
- ElectricItem.manager.use(aStack, 0, aPlayer);
- return false;
- }
-
- @Override
- public boolean onBlockDestroyed(ItemStack var1, World var2, Block var3, int var4, int var5, int var6,
- EntityLivingBase var7) {
- ElectricItem.manager.use(var1, 0, var7);
- if (ElectricItem.manager.canUse(var1, 500 * this.multi)) {
- ElectricItem.manager.use(var1, 500 * this.multi, var7);
- } else {
- ElectricItem.manager.discharge(var1, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, false);
- }
- return true;
- }
-
- @Override
- public boolean canHarvestBlock(Block par1Block, ItemStack itemStack) {
- return par1Block.getMaterial()
- .equals(Material.glass)
- || par1Block.getMaterial()
- .equals(Material.clay)
- || par1Block.getMaterial()
- .equals(Material.packedIce)
- || par1Block.getMaterial()
- .equals(Material.ice)
- || par1Block.getMaterial()
- .equals(Material.sand)
- || par1Block.getMaterial()
- .equals(Material.ground)
- || par1Block.getMaterial()
- .equals(Material.rock)
- || mineableBlocks.contains(par1Block);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List<ItemStack> itemList) {
- ItemStack itemStack = new ItemStack(this, 1);
- if (this.getChargedItem(itemStack) == this) {
- ItemStack charged = new ItemStack(this, 1);
- ElectricItem.manager.charge(charged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
- itemList.add(charged);
- }
- if (this.getEmptyItem(itemStack) == this) {
- itemList.add(new ItemStack(this, 1, this.getMaxDamage()));
- }
- }
-
- @Override
- public boolean canProvideEnergy(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public Item getChargedItem(ItemStack itemStack) {
- return this;
- }
-
- @Override
- public Item getEmptyItem(ItemStack itemStack) {
- return this;
- }
-
- @Override
- public double getMaxCharge(ItemStack itemStack) {
- return this.mCharge;
- }
-
- @Override
- public int getTier(ItemStack itemStack) {
- return this.mTier;
- }
-
- @Override
- public double getTransferLimit(ItemStack itemStack) {
- return this.mTransfer;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister iconRegister) {
- this.icon = iconRegister.registerIcon("bartworks:GT_Rockcutter");
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIconFromDamage(int par1) {
- return this.icon;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java
deleted file mode 100644
index 6728a791e4..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import java.util.List;
-import java.util.Set;
-
-import net.minecraft.block.Block;
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.entity.EntityLiving;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.ItemTool;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.google.common.collect.Sets;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.api.item.ElectricItem;
-import ic2.api.item.IElectricItem;
-
-public class GT_Teslastaff_Item extends ItemTool implements IElectricItem {
-
- private static final Set<Block> effective = Sets.newHashSet(Blocks.web);
- private final double mCharge;
- private final double mTransfer;
- public int mTier;
-
- @SideOnly(Side.CLIENT)
- private IIcon icon;
-
- public GT_Teslastaff_Item() {
- super(0, Item.ToolMaterial.GOLD, GT_Teslastaff_Item.effective);
- this.setCreativeTab(MainMod.GT2);
- this.setNoRepair();
- this.mCharge = 10000000D;
- this.mTransfer = 8192D;
- this.mTier = 4;
- this.setMaxStackSize(1);
- this.setMaxDamage(27);
- this.setUnlocalizedName("GT_Teslastaff_Item");
- }
-
- @Override
- public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
- aList.add(StatCollector.translateToLocal("tooltip.teslastaff.0.name"));
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public boolean hitEntity(ItemStack aStack, EntityLivingBase aTarget, EntityLivingBase aPlayer) {
- if (aTarget instanceof EntityLiving tTarget && ElectricItem.manager.canUse(aStack, 9000000)) {
- ElectricItem.manager.use(aStack, 9000000, aPlayer);
- for (int i = 1; i < 5; ++i) {
- if (tTarget.getEquipmentInSlot(i) != null && tTarget.getEquipmentInSlot(i)
- .getItem() instanceof IElectricItem) {
- tTarget.setCurrentItemOrArmor(i, null);
- }
- }
- }
- return true;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List<ItemStack> itemList) {
- ItemStack itemStack = new ItemStack(this, 1);
- if (this.getChargedItem(itemStack) == this) {
- ItemStack charged = new ItemStack(this, 1);
- ElectricItem.manager.charge(charged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
- itemList.add(charged);
- }
- if (this.getEmptyItem(itemStack) == this) {
- itemList.add(new ItemStack(this, 1, this.getMaxDamage()));
- }
- }
-
- @Override
- public boolean canProvideEnergy(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public Item getChargedItem(ItemStack itemStack) {
- return this;
- }
-
- @Override
- public Item getEmptyItem(ItemStack itemStack) {
- return this;
- }
-
- @Override
- public double getMaxCharge(ItemStack itemStack) {
- return this.mCharge;
- }
-
- @Override
- public boolean isRepairable() {
- return false;
- }
-
- @Override
- public int getTier(ItemStack itemStack) {
- return this.mTier;
- }
-
- @Override
- public double getTransferLimit(ItemStack itemStack) {
- return this.mTransfer;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister iconRegister) {
- this.icon = iconRegister.registerIcon("bartworks:GT_Teslastaff");
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIconFromDamage(int par1) {
- return this.icon;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java
deleted file mode 100644
index a4712dc36a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import java.util.List;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-
-public class LabModule extends SimpleSubItemClass {
-
- public LabModule(String[] tex) {
- super(tex);
- this.setCreativeTab(MainMod.BIO_TAB);
- }
-
- @Override
- public String getUnlocalizedName(ItemStack stack) {
- return "labModule." + super.getUnlocalizedName(stack);
- }
-
- @Override
- public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List<String> aList, boolean p_77624_4_) {
- aList.add(StatCollector.translateToLocal("tooltip.labmodule.0.name"));
- super.addInformation(p_77624_1_, p_77624_2_, aList, p_77624_4_);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java
deleted file mode 100644
index cb5a65c13b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import static com.github.bartimaeusnek.bartworks.common.loaders.BioItemList.getAllDNASampleFlasks;
-import static com.github.bartimaeusnek.bartworks.common.loaders.BioItemList.getAllPetriDishes;
-import static com.github.bartimaeusnek.bartworks.common.loaders.BioItemList.getAllPlasmidCells;
-
-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.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public class LabParts extends SimpleSubItemClass {
-
- public LabParts(String[] tex) {
- super(tex);
- this.setCreativeTab(MainMod.BIO_TAB);
- }
-
- @Override
- public EnumRarity getRarity(ItemStack itemStack) {
-
- if (itemStack == null || itemStack.getTagCompound() == null) return EnumRarity.common;
-
- return switch (itemStack.getItemDamage()) {
- case 0 -> BW_Util.getRarityFromByte(
- itemStack.getTagCompound()
- .getCompoundTag("DNA")
- .getByte("Rarity"));
- case 1, 2 -> BW_Util.getRarityFromByte(
- itemStack.getTagCompound()
- .getByte("Rarity"));
- default -> EnumRarity.common;
- };
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public int getColorFromItemStack(ItemStack stack, int p_82790_2_) {
- if (stack.getItemDamage() == 0 && stack.getTagCompound() != null
- && stack.getTagCompound()
- .getIntArray("Color") != null
- && stack.getTagCompound()
- .getIntArray("Color").length > 0) {
- int[] rgb = stack.getTagCompound()
- .getIntArray("Color");
- return BW_ColorUtil.getColorFromRGBArray(rgb);
- }
- return super.getColorFromItemStack(stack, p_82790_2_);
- }
-
- @Override
- public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List<String> list, boolean b) {
- if (itemStack == null) return;
-
- if (itemStack.getTagCompound() == null) {
- switch (itemStack.getItemDamage()) {
- case 0:
- list.add(StatCollector.translateToLocal("tooltip.labparts.0.name"));
- break;
- case 1:
- list.add(StatCollector.translateToLocal("tooltip.labparts.1.name"));
- break;
- case 2:
- list.add(StatCollector.translateToLocal("tooltip.labparts.2.name"));
- break;
- case 3:
- list.add(StatCollector.translateToLocal("tooltip.labparts.3.name"));
- break;
- case 4:
- list.add(StatCollector.translateToLocal("tooltip.labparts.4.name"));
- break;
- default:
- break;
- }
- super.addInformation(itemStack, entityPlayer, list, b);
- return;
- }
-
- BioCulture culture = BioCulture.getBioCulture(
- itemStack.getTagCompound()
- .getString("Name"));
-
- switch (itemStack.getItemDamage()) {
- case 0:
- list.add(
- StatCollector.translateToLocal("tooltip.labparts.5.name") + " "
- + itemStack.getTagCompound()
- .getString("Name")
- + (culture != null ? " (" + culture.getLocalisedName() + ")" : ""));
- if (!itemStack.getTagCompound()
- .getBoolean("Breedable")) {
- list.add(StatCollector.translateToLocal("tooltip.labparts.6.name"));
- }
- break;
- case 1:
- list.add(
- StatCollector.translateToLocal("tooltip.labparts.7.name") + " "
- + itemStack.getTagCompound()
- .getString("Name")
- + (culture != null ? " (" + culture.getLocalisedName() + ")" : ""));
- break;
- case 2:
- list.add(
- StatCollector.translateToLocal("tooltip.labparts.8.name") + " "
- + itemStack.getTagCompound()
- .getString("Name")
- + (culture != null ? " (" + culture.getLocalisedName() + ")" : ""));
- break;
- default:
- break;
- }
- super.addInformation(itemStack, entityPlayer, list, b);
- }
-
- @Override
- public void getSubItems(Item item, CreativeTabs creativeTabs, List<ItemStack> list) {
- list.addAll(getAllPetriDishes());
- list.addAll(getAllDNASampleFlasks());
- list.addAll(getAllPlasmidCells());
- super.getSubItems(item, creativeTabs, list);
- }
-
- @Override
- public String getUnlocalizedName(ItemStack itemStack) {
- if (itemStack.getItemDamage() == 0 && itemStack.getTagCompound() != null)
- return "filled.item." + this.tex[itemStack.getItemDamage()].replace('/', '.');
- return super.getUnlocalizedName(itemStack);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java
deleted file mode 100644
index e31e23d47c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.item.Item;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public class SimpleIconItem extends Item {
-
- private final String tex;
-
- public SimpleIconItem(String tex) {
- this.tex = tex;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister iconRegister) {
- this.itemIcon = iconRegister.registerIcon("bartworks:" + this.tex);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java
deleted file mode 100644
index 8d5b239a75..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.items;
-
-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.util.IIcon;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-
-public class SimpleSubItemClass extends Item {
-
- @SideOnly(Side.CLIENT)
- protected IIcon[] itemIcon;
-
- String[] tex;
-
- public SimpleSubItemClass(String... tex) {
- this.tex = tex;
- this.hasSubtypes = true;
- this.setCreativeTab(MainMod.BWT);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister iconRegister) {
- this.itemIcon = new IIcon[this.tex.length];
- for (int i = 0; i < this.tex.length; i++) {
- this.itemIcon[i] = iconRegister.registerIcon(MainMod.MOD_ID + ":" + this.tex[i]);
- }
- }
-
- @Override
- public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List<String> aList, boolean p_77624_4_) {
- super.addInformation(p_77624_1_, p_77624_2_, aList, p_77624_4_);
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List<ItemStack> p_150895_3_) {
- for (int i = 0; i < this.tex.length; i++) {
- p_150895_3_.add(new ItemStack(p_150895_1_, 1, i));
- }
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public IIcon getIconFromDamage(int p_77617_1_) {
- if (p_77617_1_ < this.tex.length) return this.itemIcon[p_77617_1_];
- return this.itemIcon[0];
- }
-
- @Override
- public String getUnlocalizedName(ItemStack stack) {
- if (stack.getItemDamage() < this.tex.length) return "item." + this.tex[stack.getItemDamage()].replace('/', '.');
- return "WrongDamageItemDestroyIt";
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java
deleted file mode 100644
index 6268342cce..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
-import static gregtech.api.recipe.RecipeMaps.benderRecipes;
-import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
-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.COIL_HEAT;
-import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.BW_GT_MaterialReference;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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.RecipeMaps;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
-
-public class ArtificialMicaLine {
-
- public static void runArtificialMicaRecipe() {
- // Mg + O = MgO
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Magnesium.getDust(1))
- .itemOutputs(Materials.Magnesia.getDust(2))
- .fluidInputs(Materials.Oxygen.getGas(1000))
- .duration(2 * SECONDS)
- .eut(8)
- .addTo(UniversalChemical);
- // Si + 6HF = H2SiF6 + 4H
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Silicon.getDust(1), Materials.Empty.getCells(4))
- .itemOutputs(Materials.Hydrogen.getCells(4))
- .fluidInputs(Materials.HydrofluoricAcid.getFluid(6000))
- .fluidOutputs(WerkstoffLoader.HexafluorosilicicAcid.getFluidOrGas(1000))
- .duration(20 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(UniversalChemical);
- // K + Cl = KCl
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Potassium.getDust(1), GT_Utility.getIntegratedCircuit(2))
- .itemOutputs(Materials.RockSalt.getDust(2))
- .fluidInputs(Materials.Chlorine.getGas(1000))
- .duration(20 * TICKS)
- .eut(8)
- .addTo(UniversalChemical);
-
- // 2KCl + H2SiF6 = 2HCl + K2SiF6
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.RockSalt.getDust(4))
- .itemOutputs(WerkstoffLoader.Potassiumfluorosilicate.get(OrePrefixes.dust, 9))
- .fluidInputs(WerkstoffLoader.HexafluorosilicicAcid.getFluidOrGas(1000))
- .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000))
- .duration(1 * SECONDS)
- .eut(8)
- .addTo(mixerRecipes);
-
- // 2K + CO2 + O = K2CO3
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Potassium.getDust(2), Materials.CarbonDioxide.getCells(1))
- .itemOutputs(WerkstoffLoader.PotassiumCarbonate.get(OrePrefixes.dust, 6), Materials.Empty.getCells(1))
- .fluidInputs(Materials.Oxygen.getGas(1000))
- .duration(2 * SECONDS)
- .eut(8)
- .addTo(UniversalChemical);
- // K2O + CO2 = K2CO3
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Potash.getDust(3), Materials.CarbonDioxide.getCells(1))
- .itemOutputs(WerkstoffLoader.PotassiumCarbonate.get(OrePrefixes.dust, 6), Materials.Empty.getCells(1))
- .duration(2 * SECONDS)
- .eut(8)
- .addTo(UniversalChemical);
-
- // 55Quartz Dust + 20K2SiF6 + 12Al2O3 + 4K2CO3 = 91Raw Fluorophlogopite Dust
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.QuartzSand.getDust(55),
- WerkstoffLoader.Potassiumfluorosilicate.get(OrePrefixes.dust, 20),
- WerkstoffLoader.Alumina.get(OrePrefixes.dust, 12),
- WerkstoffLoader.PotassiumCarbonate.get(OrePrefixes.dust, 4),
- GT_Utility.getIntegratedCircuit(4))
- .itemOutputs(
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 64),
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 27))
- .duration(20 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(mixerRecipes);
-
- // 55Quartzite/Nether Quartz Dust + 20K2SiF6 + 57Al2O3 + 4K2CO3 = 136Raw Fluorophlogopite Dust
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.Quartzite.getDust(55),
- WerkstoffLoader.Potassiumfluorosilicate.get(OrePrefixes.dust, 20),
- WerkstoffLoader.Alumina.get(OrePrefixes.dust, 57),
- WerkstoffLoader.PotassiumCarbonate.get(OrePrefixes.dust, 4),
- GT_Utility.getIntegratedCircuit(4))
- .itemOutputs(
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 64),
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 64),
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 8))
- .fluidInputs()
- .fluidOutputs()
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.NetherQuartz.getDust(55),
- WerkstoffLoader.Potassiumfluorosilicate.get(OrePrefixes.dust, 20),
- WerkstoffLoader.Alumina.get(OrePrefixes.dust, 57),
- WerkstoffLoader.PotassiumCarbonate.get(OrePrefixes.dust, 4),
- GT_Utility.getIntegratedCircuit(4))
- .itemOutputs(
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 64),
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 64),
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 8))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(mixerRecipes);
-
- // 62Certus Quartz Dust + 10K2SiF6 + 12Al2O3 + 7K2CO3 = 91Raw Fluorophlogopite Dust
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.CertusQuartz.getDust(62),
- WerkstoffLoader.Potassiumfluorosilicate.get(OrePrefixes.dust, 10),
- WerkstoffLoader.Alumina.get(OrePrefixes.dust, 12),
- WerkstoffLoader.PotassiumCarbonate.get(OrePrefixes.dust, 7),
- GT_Utility.getIntegratedCircuit(4))
- .itemOutputs(
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 64),
- WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 27))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(mixerRecipes);
-
- // MgO(s) = MgO(l)
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Magnesia.getDust(1))
- .fluidOutputs(Materials.Magnesia.getMolten(144))
- .duration(20 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(fluidExtractionRecipes);
-
- // 27Raw Fluorophlogopite Dust + 720MgO(l) = 4608Fluorophlogopite(l)
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.RawFluorophlogopite.get(OrePrefixes.dust, 27))
- .itemOutputs(Materials.Glass.getDust(1))
- .fluidInputs(BW_GT_MaterialReference.Magnesia.getMolten(720))
- .fluidOutputs(WerkstoffLoader.HotFluorophlogopite.getFluidOrGas(4608))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .metadata(COIL_HEAT, 1700)
- .addTo(blastFurnaceRecipes);
-
- // 144Fluorophlogopite(l) = Fluorophlogopite
- RecipeMaps.vacuumFreezerRecipes.addRecipe(
- new GT_Recipe(
- false,
- new ItemStack[] { ItemList.Shape_Mold_Plate.get(0) },
- new ItemStack[] { WerkstoffLoader.Fluorophlogopite.get(OrePrefixes.plate, 1) },
- null,
- null,
- new FluidStack[] { WerkstoffLoader.HotFluorophlogopite.getFluidOrGas(144) },
- null,
- 10,
- 120,
- 0));
- // Fluorophlogopite = 4Insulator Foil
- if (NewHorizonsCoreMod.isModLoaded()) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- WerkstoffLoader.Fluorophlogopite.get(OrePrefixes.plate, 1),
- GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 4))
- .duration(10 * TICKS)
- .eut(600)
- .addTo(benderRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java
deleted file mode 100644
index 88fab90aea..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.Mods.BartWorks;
-
-import java.lang.reflect.Field;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.oredict.OreDictionary;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-import com.github.bartimaeusnek.bartworks.common.items.BW_ItemBlocks;
-
-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.registry.GameRegistry;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.SubTag;
-import ic2.core.Ic2Items;
-
-/**
- * This class gets injected into GT via ASM! DO NOT CALL IT YOURSELF!
- */
-public class BeforeGTPreload implements Runnable {
-
- private static boolean didrun;
-
- @Override
- public void run() {
- if (didrun) return;
- // fixing BorosilicateGlass... -_-'
- Materials.BorosilicateGlass
- .add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_RECYCLING, SubTag.SMELTING_TO_FLUID);
-
- Field activeContainer = FieldUtils.getDeclaredField(LoadController.class, "activeContainer", true);
- ModContainer bartworks = null;
- ModContainer gregtech = Loader.instance()
- .activeModContainer();
- boolean switchback = false;
- LoadController modController = null;
- if (!Loader.instance()
- .activeModContainer()
- .getModId()
- .equals(BartWorks.ID)) {
- Field fieldModController = FieldUtils.getDeclaredField(Loader.class, "modController", true);
- try {
- modController = (LoadController) fieldModController.get(Loader.instance());
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- FMLCommonHandler.instance()
- .exitJava(-1, true);
- }
-
- assert modController != null;
- for (ModContainer mod : modController.getActiveModList()) {
- if (mod.getModId()
- .equals(BartWorks.ID)) {
- bartworks = mod;
- }
- if (bartworks != null) break;
- }
- if (bartworks == null || gregtech == null) FMLCommonHandler.instance()
- .exitJava(-1, true);
-
- try {
- activeContainer.set(modController, bartworks);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- FMLCommonHandler.instance()
- .exitJava(-1, true);
- }
- switchback = true;
- }
-
- Block[] bw_glasses;
- try {
- bw_glasses = (Block[]) Class.forName("com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry")
- .getField("bw_glasses")
- .get(null);
- GameRegistry.registerBlock(bw_glasses[0], BW_ItemBlocks.class, "BW_GlasBlocks");
- GameRegistry.registerBlock(bw_glasses[1], BW_ItemBlocks.class, "BW_GlasBlocks2");
- OreDictionary.registerOre("blockGlassHV", new ItemStack(Blocks.glass, 1, Short.MAX_VALUE));
- OreDictionary.registerOre("blockGlassHV", new ItemStack(bw_glasses[0], 1, 0));
- OreDictionary.registerOre("blockGlassEV", Ic2Items.reinforcedGlass);
- OreDictionary.registerOre("blockGlassEV", new ItemStack(bw_glasses[0], 1, 1));
- OreDictionary.registerOre("blockGlassIV", new ItemStack(bw_glasses[0], 1, 12));
- OreDictionary.registerOre("blockGlassIV", new ItemStack(bw_glasses[0], 1, 2));
- OreDictionary.registerOre("blockGlassLuV", new ItemStack(bw_glasses[0], 1, 3));
- OreDictionary.registerOre("blockGlassZPM", new ItemStack(bw_glasses[0], 1, 4));
- OreDictionary.registerOre("blockGlassUV", new ItemStack(bw_glasses[0], 1, 5));
- OreDictionary.registerOre("blockGlassUHV", new ItemStack(bw_glasses[0], 1, 13));
- OreDictionary.registerOre("blockGlassUEV", new ItemStack(bw_glasses[0], 1, 14));
- OreDictionary.registerOre("blockGlassUIV", new ItemStack(bw_glasses[0], 1, 15));
- OreDictionary.registerOre("blockGlassUMV", new ItemStack(bw_glasses[1], 1, 0));
- } catch (IllegalAccessException | NoSuchFieldException | ClassNotFoundException e) {
- e.printStackTrace();
- FMLCommonHandler.instance()
- .exitJava(-1, true);
- }
- if (switchback) {
- try {
- activeContainer.set(modController, gregtech);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- FMLCommonHandler.instance()
- .exitJava(-1, true);
- }
- }
- BeforeGTPreload.didrun = true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java
deleted file mode 100644
index 5bf9ff8185..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import java.awt.Color;
-
-import net.minecraft.item.EnumRarity;
-
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.BioDNA;
-import com.github.bartimaeusnek.bartworks.util.BioData;
-import com.github.bartimaeusnek.bartworks.util.BioPlasmid;
-
-public class BioCultureLoader {
-
- public static final BioData BIO_DATA_BETA_LACMATASE = BioData
- .createAndRegisterBioData("beta-Lactamase", EnumRarity.uncommon, 10000, 0);
- private static final BioData BIO_DATA_YEAST = BioData
- .createAndRegisterBioData("Saccharomyces cerevisiae", EnumRarity.common);
- private static final BioDNA BIO_DNA_WHINE_YEAST = BioDNA
- .createAndRegisterBioDNA("Saccharomyces cerevisiae var bayanus", EnumRarity.uncommon);
- private static final BioDNA BIO_DNA_BEER_YEAST = BioDNA
- .createAndRegisterBioDNA("Saccharomyces cerevisiae var cerevisiae", EnumRarity.uncommon);
- private static final BioData eColiData = BioData
- .createAndRegisterBioData("Escherichia koli", EnumRarity.uncommon, 10000, 0);
- private static final BioDNA BIO_DNA_ANAEROBIC_OIL = BioDNA
- .createAndRegisterBioDNA("Pseudomonas Veronii", EnumRarity.uncommon);
- private static final BioData BIO_DATA_ANAEROBIC_OIL = BioData
- .createAndRegisterBioData("Pseudomonas Veronii", EnumRarity.uncommon, 5000, 1);
- public static BioCulture CommonYeast;
- public static BioCulture WhineYeast;
- public static BioCulture BeerYeast;
- public static BioCulture rottenFleshBacteria;
- public static BioCulture eColi;
- public static BioCulture anaerobicOil;
- public static BioCulture generalPurposeFermentingBacteria;
-
- public static void run() {
- BioCultureLoader.CommonYeast = BioCulture.createAndRegisterBioCulture(
- new Color(255, 248, 200),
- "Saccharomyces cerevisiae",
- BioPlasmid.convertDataToPlasmid(BioCultureLoader.BIO_DATA_YEAST),
- BioDNA.convertDataToDNA(BioCultureLoader.BIO_DATA_YEAST),
- true);
- BioCultureLoader.WhineYeast = BioCulture.createAndRegisterBioCulture(
- new Color(255, 248, 200),
- "Saccharomyces cerevisiae var bayanus",
- BioPlasmid.convertDataToPlasmid(BioCultureLoader.BIO_DNA_WHINE_YEAST),
- BioCultureLoader.BIO_DNA_WHINE_YEAST,
- EnumRarity.uncommon,
- true);
- BioCultureLoader.BeerYeast = BioCulture.createAndRegisterBioCulture(
- new Color(255, 248, 200),
- "Saccharomyces cerevisiae var cerevisiae",
- BioPlasmid.convertDataToPlasmid(BioCultureLoader.BIO_DNA_BEER_YEAST),
- BioCultureLoader.BIO_DNA_BEER_YEAST,
- EnumRarity.uncommon,
- true);
- BioCultureLoader.rottenFleshBacteria = BioCulture.createAndRegisterBioCulture(
- new Color(110, 40, 25),
- "Escherichia cadaver",
- BioPlasmid.convertDataToPlasmid(BioCultureLoader.BIO_DATA_BETA_LACMATASE),
- BioDNA.convertDataToDNA(BioCultureLoader.BIO_DATA_BETA_LACMATASE),
- false);
- BioCultureLoader.eColi = BioCulture.createAndRegisterBioCulture(
- new Color(149, 132, 75),
- "Escherichia koli",
- BioPlasmid.convertDataToPlasmid(BioCultureLoader.eColiData),
- BioDNA.convertDataToDNA(BioCultureLoader.eColiData),
- true);
- BioCultureLoader.anaerobicOil = BioCulture.createAndRegisterBioCulture(
- new Color(0, 0, 0),
- "Pseudomonas Veronii",
- BioPlasmid.convertDataToPlasmid(BioCultureLoader.BIO_DNA_ANAEROBIC_OIL),
- BioDNA.convertDataToDNA(BioCultureLoader.BIO_DATA_ANAEROBIC_OIL),
- true);
- BioCultureLoader.generalPurposeFermentingBacteria = BioCulture.createAndRegisterBioCulture(
- new Color(127, 69, 26),
- "Saccharomyces escherichia",
- BioCultureLoader.CommonYeast.getPlasmid(),
- BioCultureLoader.eColi.getdDNA(),
- EnumRarity.epic,
- true);
-
- BioCultureLoader.CommonYeast.setLocalisedName("Common Yeast");
- BioCultureLoader.WhineYeast.setLocalisedName("Whine Yeast");
- BioCultureLoader.BeerYeast.setLocalisedName("Beer Yeast");
- BioCultureLoader.rottenFleshBacteria.setLocalisedName("Rotten Flesh Bacteria");
- BioCultureLoader.eColi.setLocalisedName("eColi Bacteria");
- BioCultureLoader.anaerobicOil.setLocalisedName("Anaerobic Oil Bacteria");
- BioCultureLoader.generalPurposeFermentingBacteria.setLocalisedName("General Purpose Fermenting Bacteria");
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java
deleted file mode 100644
index 8b86d4cd93..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.items.LabModule;
-import com.github.bartimaeusnek.bartworks.common.items.LabParts;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.BioDNA;
-import com.github.bartimaeusnek.bartworks.util.BioData;
-import com.github.bartimaeusnek.bartworks.util.BioPlasmid;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-
-public class BioItemList {
-
- private BioItemList() {}
-
- private static final Item mItemBioLabParts = new LabModule(
- new String[] { "DNAExtractionModule", "PCRThermoclyclingModule", "PlasmidSynthesisModule",
- "TransformationModule", "ClonalCellularSynthesisModule" });
- public static final ItemStack[] mBioLabParts = { new ItemStack(BioItemList.mItemBioLabParts),
- new ItemStack(BioItemList.mItemBioLabParts, 1, 1), new ItemStack(BioItemList.mItemBioLabParts, 1, 2),
- new ItemStack(BioItemList.mItemBioLabParts, 1, 3), new ItemStack(BioItemList.mItemBioLabParts, 1, 4) };
- private static final Item vanillaBioLabParts = new LabParts(
- new String[] { "petriDish", "DNASampleFlask", "PlasmidCell", "DetergentPowder", "Agarose", "IncubationModule",
- "PlasmaMembrane" });
-
- public static void registerBioItems() {
- GameRegistry.registerItem(BioItemList.mItemBioLabParts, "BioLabModules");
- GameRegistry.registerItem(BioItemList.vanillaBioLabParts, "BioLabParts");
- }
-
- public static Collection<ItemStack> getAllPetriDishes() {
- HashSet<ItemStack> ret = new HashSet<>();
- for (BioCulture Culture : BioCulture.BIO_CULTURE_ARRAY_LIST) {
- ret.add(BioItemList.getPetriDish(Culture));
- }
- return ret;
- }
-
- public static Collection<ItemStack> getAllDNASampleFlasks() {
- HashSet<ItemStack> ret = new HashSet<>();
- for (BioData dna : BioData.BIO_DATA_ARRAY_LIST) {
- ret.add(BioItemList.getDNASampleFlask(BioDNA.convertDataToDNA(dna)));
- }
- return ret;
- }
-
- public static Collection<ItemStack> getAllPlasmidCells() {
- HashSet<ItemStack> ret = new HashSet<>();
- for (BioData dna : BioData.BIO_DATA_ARRAY_LIST) {
- ret.add(BioItemList.getPlasmidCell(BioPlasmid.convertDataToPlasmid(dna)));
- }
- return ret;
- }
-
- public static ItemStack getPetriDish(BioCulture Culture) {
- if (Culture == null) return new ItemStack(BioItemList.vanillaBioLabParts);
- ItemStack ret = new ItemStack(BioItemList.vanillaBioLabParts);
- ret.setTagCompound(BioCulture.getNBTTagFromCulture(Culture));
- return ret;
- }
-
- public static ItemStack getDNASampleFlask(BioDNA dna) {
- if (dna == null) return new ItemStack(BioItemList.vanillaBioLabParts, 1, 1);
-
- ItemStack ret = new ItemStack(BioItemList.vanillaBioLabParts, 1, 1);
- ret.setTagCompound(BioData.getNBTTagFromBioData(dna));
- return ret;
- }
-
- public static ItemStack getPlasmidCell(BioPlasmid plasmid) {
- if (plasmid == null) return new ItemStack(BioItemList.vanillaBioLabParts, 1, 2);
- ItemStack ret = new ItemStack(BioItemList.vanillaBioLabParts, 1, 2);
- ret.setTagCompound(BioData.getNBTTagFromBioData(plasmid));
- return ret;
- }
-
- /**
- * 1 - Detergent Powder 2 - Agarose 3 - Incubation Module 4 - Plasma Membrane others are null
- *
- * @param selection see above
- * @return the selected Item
- */
- public static ItemStack getOther(int selection) {
- if (selection < 1 || selection > 4) return null;
-
- return new ItemStack(BioItemList.vanillaBioLabParts, 1, 2 + selection);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java
deleted file mode 100644
index 28ad279e28..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-public class BioLabLoader {
-
- public static void run() {
- FluidLoader.run();
- BioItemList.registerBioItems();
- BioRecipeLoader.run();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java
deleted file mode 100644
index abed08eb5e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.Mods.CropsPlusPlus;
-
-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 com.github.bartimaeusnek.bartworks.util.BWRecipes;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-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_Utility;
-
-public class BioRecipeLoader {
-
- public static void run() {
- registerWaterBasedBioLabIncubations();
- registerBacterialVatRecipes();
- }
-
- public static void registerWaterBasedBioLabIncubations() {
- FluidStack[] easyFluids = { Materials.Water.getFluid(1000L),
- FluidRegistry.getFluidStack("ic2distilledwater", 1000) };
- for (FluidStack fluidStack : easyFluids) {
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- new ItemStack(Items.rotten_flesh),
- BioCultureLoader.rottenFleshBacteria,
- new int[] { 3300 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- new ItemStack(Items.fermented_spider_eye),
- BioCultureLoader.eColi,
- new int[] { 4500 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- ItemList.Food_Dough.get(1L),
- BioCultureLoader.CommonYeast,
- new int[] { 7500 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- ItemList.Food_Dough_Sugar.get(1L),
- BioCultureLoader.WhineYeast,
- new int[] { 2500 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- ItemList.Bottle_Wine.get(1L),
- BioCultureLoader.WhineYeast,
- new int[] { 3300 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- ItemList.Bottle_Beer.get(1L),
- BioCultureLoader.BeerYeast,
- new int[] { 2500 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- ItemList.Bottle_Dark_Beer.get(1L),
- BioCultureLoader.BeerYeast,
- new int[] { 3300 },
- new FluidStack[] { fluidStack },
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART);
-
- BWRecipes.instance.addBioLabRecipeIncubation(
- new ItemStack(Blocks.dirt),
- BioCultureLoader.anaerobicOil,
- new int[] { 100 },
- new FluidStack[] { fluidStack },
- 1500,
- (int) TierEU.RECIPE_EV,
- BW_Util.STANDART);
- }
- }
-
- public static void registerWaterBasedBacterialVatRecipes() {
- FluidStack[] easyFluids = { Materials.Water.getFluid(1000L),
- FluidRegistry.getFluidStack("ic2distilledwater", 1000) };
- for (FluidStack fluidStack : easyFluids) {
- if (CropsPlusPlus.isModLoaded()) {
- BWRecipes.instance.addBacterialVatRecipe(
- new ItemStack[] { new ItemStack(Items.sugar, 64) },
- new FluidStack[] { new FluidStack(fluidStack, 100) },
- BioCultureLoader.CommonYeast,
- new FluidStack[] { FluidRegistry.getFluidStack("potion.ghp", 1) },
- 350,
- (int) TierEU.RECIPE_EV);
- }
-
- BWRecipes.instance.addBacterialVatRecipe(
- new ItemStack[] { ItemList.Crop_Drop_Grapes.get(16) },
- new FluidStack[] { new FluidStack(fluidStack, 100) },
- BioCultureLoader.WhineYeast,
- new FluidStack[] { FluidRegistry.getFluidStack("potion.wine", 12) },
- 200,
- (int) TierEU.RECIPE_MV);
-
- BWRecipes.instance.addBacterialVatRecipe(
- new ItemStack[] { new ItemStack(Items.sugar, 4), ItemList.IC2_Hops.get(16L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 8L) },
- new FluidStack[] { new FluidStack(fluidStack, 100) },
- BioCultureLoader.BeerYeast,
- new FluidStack[] { FluidRegistry.getFluidStack("potion.beer", 5) },
- 600,
- (int) TierEU.RECIPE_LV);
- BWRecipes.instance.addBacterialVatRecipe(
- new ItemStack[] { ItemList.IC2_Hops.get(32L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 16L) },
- new FluidStack[] { new FluidStack(fluidStack, 100) },
- BioCultureLoader.BeerYeast,
- new FluidStack[] { FluidRegistry.getFluidStack("potion.darkbeer", 10) },
- 600,
- (int) TierEU.RECIPE_LV);
- }
- }
-
- public static void registerBacterialVatRecipes() {
- registerWaterBasedBacterialVatRecipes();
-
- BWRecipes.instance.addBacterialVatRecipe(
- null,
- new FluidStack[] { FluidRegistry.getFluidStack("potion.grapejuice", 100) },
- BioCultureLoader.WhineYeast,
- new FluidStack[] { FluidRegistry.getFluidStack("potion.wine", 12) },
- 400,
- (int) TierEU.RECIPE_LV);
-
- BWRecipes.instance.addBacterialVatRecipe(
- null,
- new FluidStack[] { Materials.FermentedBiomass.getFluid(10000) },
- BioCultureLoader.anaerobicOil,
- new FluidStack[] { new FluidStack(FluidLoader.fulvicAcid, 1000) },
- 2748,
- (int) TierEU.RECIPE_HV);
- }
-
- public static void runOnServerStarted() {
- RecipeMaps.fermentingRecipes.getAllRecipes()
- .forEach(
- recipe -> BWRecipes.instance.addBacterialVatRecipe(
- new ItemStack[] { null },
- BioCultureLoader.generalPurposeFermentingBacteria,
- recipe.mFluidInputs,
- recipe.mFluidOutputs,
- recipe.mDuration,
- recipe.mEUt,
- GT_Utility.getTier(recipe.mEUt)));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java
deleted file mode 100644
index 1a7e49aaa3..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.GT_Values.M;
-import static gregtech.api.enums.Mods.Avaritia;
-import static gregtech.api.enums.Mods.EternalSingularity;
-import static gregtech.api.enums.Mods.GoodGenerator;
-import static gregtech.api.enums.Mods.OpenComputers;
-import static gregtech.api.enums.Mods.SuperSolarPanels;
-import static gregtech.api.enums.Mods.UniversalSingularities;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-
-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 ElectricImplosionCompressorRecipes implements Runnable {
-
- private static void addElectricImplosionRecipe(final ItemStack[] inputItems, final FluidStack[] inputFluids,
- final ItemStack[] outputItems, final FluidStack[] outputFluids, final int durationInTicks,
- final int EUPerTick) {
- BartWorksRecipeMaps.electricImplosionCompressorRecipes
- .addRecipe(false, inputItems, outputItems, null, inputFluids, outputFluids, durationInTicks, EUPerTick, 1);
- }
-
- private static final ItemStack[] circuits = { ItemList.Circuit_ExoticProcessor.get(1),
- ItemList.Circuit_OpticalAssembly.get(1), ItemList.Circuit_Biowaresupercomputer.get(1),
- ItemList.Circuit_Wetwaremainframe.get(1) };
-
- @Override
- public void run() {
- // Custom electric implosion compressor recipes. Cannot be overclocked.
-
- if (EternalSingularity.isModLoaded()) {
-
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { GT_Values.NI },
- new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(72L) },
- // OUT.
- new ItemStack[] { getModItem(EternalSingularity.ID, "eternal_singularity", 1L) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 100 * 20,
- (int) TierEU.RECIPE_UMV);
-
- if (UniversalSingularities.isModLoaded())
- // Raw Exposed Optical Chip
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { ItemList.Circuit_Silicon_Wafer7.get(1L),
- // Fluxed Electrum Singularity.
- getModItem(UniversalSingularities.ID, "universal.general.singularity", 1L, 20) },
- new FluidStack[] { GT_Values.NF },
- // OUT.
- new ItemStack[] { ItemList.Circuit_Chip_Optical.get(16L) },
- new FluidStack[] { GT_Values.NF },
- 5 * 20,
- (int) TierEU.RECIPE_UMV);
-
- }
-
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { getModItem(GoodGenerator.ID, "highDensityPlutoniumNugget", 5L) },
- new FluidStack[] { Materials.Neutronium.getMolten(72L) },
- // OUT.
- new ItemStack[] { getModItem(GoodGenerator.ID, "highDensityPlutonium", 1L) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 1,
- (int) TierEU.RECIPE_UEV);
-
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { getModItem(GoodGenerator.ID, "highDensityUraniumNugget", 5L) },
- new FluidStack[] { Materials.Neutronium.getMolten(72L) },
- // OUT.
- new ItemStack[] { getModItem(GoodGenerator.ID, "highDensityUranium", 1L) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 1,
- (int) TierEU.RECIPE_UEV);
-
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { getModItem(GoodGenerator.ID, "highDensityThoriumNugget", 5L) },
- new FluidStack[] { Materials.Neutronium.getMolten(72L) },
- // OUT.
- new ItemStack[] { getModItem(GoodGenerator.ID, "highDensityThorium", 1L) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 1,
- (int) TierEU.RECIPE_UEV);
-
- // Magneto material recipe for base fluid.
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.WhiteDwarfMatter, 1L),
- GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.Universium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.BlackDwarfMatter, 1L) },
- new FluidStack[] { MaterialsUEVplus.RawStarMatter.getFluid(64 * 144L) },
- // OUT.
- new ItemStack[] { GT_Values.NI },
- new FluidStack[] { MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(16 * 144L) },
- // Recipe stats.
- 20 * 4,
- (int) TierEU.RECIPE_UXV);
-
- // Infinity Catalyst
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfinityCatalyst, 64L), },
- new FluidStack[] { GT_Values.NF },
- // OUT.
- new ItemStack[] { getModItem(Avaritia.ID, "Resource", 1L, 5) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 1 * 1,
- (int) TierEU.RECIPE_UIV);
-
- if (UniversalSingularities.isModLoaded()) {
- // Fluxed Singularity
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.block, Materials.ElectrumFlux, 16L), },
- new FluidStack[] { GT_Values.NF },
- // OUT.
- new ItemStack[] { getModItem(UniversalSingularities.ID, "universal.general.singularity", 1L, 20) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 1 * 1,
- (int) TierEU.RECIPE_UIV);
-
- // Iron Singularity
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { GT_Values.NI },
- new FluidStack[] { Materials.Iron.getMolten(7296 * 9 * 144L) },
- // OUT.
- new ItemStack[] { getModItem(Avaritia.ID, "Singularity", 1L, 0) },
- new FluidStack[] { GT_Values.NF },
- // Recipe stats.
- 1 * 1,
- (int) TierEU.RECIPE_UIV);
- }
- // MHDCSM V2
- addElectricImplosionRecipe(
- // IN.
- new ItemStack[] { MaterialsUEVplus.Eternity.getNanite(1), MaterialsUEVplus.Universium.getNanite(1) },
- new FluidStack[] { MaterialsUEVplus.RawStarMatter.getFluid(128 * 144L) },
- // OUT.
- new ItemStack[] { GT_Values.NI },
- new FluidStack[] { MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(32 * 144L) },
- // Recipe stats.
- 20 * 4,
- (int) TierEU.RECIPE_MAX);
-
- this.addMagnetohydrodynamicallyConstrainedStarMatterPartRecipes();
- }
-
- private void addMagnetohydrodynamicallyConstrainedStarMatterPartRecipes() {
-
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.frameGt, 1, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.nugget, 9, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.ingot, 1, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.plate, 1, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.plateDense, 1, 3);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.stick, 2, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.round, 8, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.bolt, 8, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.screw, 8, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.ring, 4, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.foil, 8, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.itemCasing, 2, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.gearGtSmall, 1, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.rotor, 1, 2);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.stickLong, 1, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.springSmall, 2, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.spring, 1, 1);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.gearGt, 1, 2);
- this.addWhiteDwarfMagnetoEICRecipe(OrePrefixes.wireFine, 8, 1);
- }
-
- private void addWhiteDwarfMagnetoEICRecipe(final OrePrefixes part, final int multiplier,
- final int circuitMultiplier) {
-
- final int partFraction = (int) (144 * part.mMaterialAmount / M);
-
- for (ItemStack circuit : circuits) {
- addElectricImplosionRecipe(
- new ItemStack[] { circuit.splitStack(circuitMultiplier),
- getModItem(SuperSolarPanels.ID, "solarsplitter", 1, 0),
- getModItem(OpenComputers.ID, "hologram2", circuitMultiplier, 0),
- GT_OreDictUnificator.get(part, MaterialsUEVplus.Eternity, multiplier), },
- new FluidStack[] { MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter
- .getMolten((long) partFraction * multiplier) },
- new ItemStack[] { GT_OreDictUnificator
- .get(part, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, multiplier) },
- new FluidStack[] { GT_Values.NF },
- (int) (multiplier * (20 * partFraction / 144.0)),
- (int) TierEU.RECIPE_UXV);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java
deleted file mode 100644
index 809e52e6d1..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.Mods.Gendustry;
-import static gregtech.api.enums.Mods.GregTech;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import java.awt.Color;
-
-import net.minecraft.block.Block;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.IIcon;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.renderer.RendererGlasBlock;
-import com.github.bartimaeusnek.bartworks.client.renderer.RendererSwitchingColorFluid;
-import com.github.bartimaeusnek.bartworks.common.blocks.BioFluidBlock;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BWTileEntityDimIDBridge;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-
-import cpw.mods.fml.client.registry.RenderingRegistry;
-import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.FluidState;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TierEU;
-import gregtech.api.fluid.GT_FluidFactory;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.items.GT_MetaGenerated_Item_98;
-
-public class FluidLoader {
-
- public static IIcon autogenIIcon;
- public static Fluid ff;
- public static int renderID;
- public static Block bioFluidBlock;
- public static Fluid[] BioLabFluidMaterials;
- public static ItemStack[] BioLabFluidCells;
-
- // OilProcessing chain
- public static Fluid fulvicAcid, heatedfulvicAcid, Kerogen;
-
- public static void run() {
- renderID = RenderingRegistry.getNextAvailableRenderId();
- ff = new Fluid("BWfakeFluid");
- GregTech_API.sGTBlockIconload.add(
- () -> ff.setIcons(
- GregTech_API.sBlockIcons
- .registerIcon(GregTech.getResourcePath("fluids", "fluid.molten.autogenerated"))));
- fulvicAcid = createAndRegisterFluid("Fulvic Acid", new Color(20, 20, 20));
- heatedfulvicAcid = createAndRegisterFluid("Heated Fulvic Acid", new Color(40, 20, 20), 720);
- Kerogen = createAndRegisterFluid("Kerogen", new Color(85, 85, 85));
- BioLabFluidMaterials = new Fluid[] { createAndRegisterFluid("FluorecentdDNA", new Color(125, 50, 170)),
- createAndRegisterFluid("EnzymesSollution", new Color(240, 200, 125)),
- createAndRegisterFluid("Penicillin", new Color(255, 255, 255)),
- createAndRegisterFluid("Polymerase", new Color(110, 180, 110)) };
-
- BioLabFluidCells = new ItemStack[BioLabFluidMaterials.length];
-
- GT_MetaGenerated_Item_98.FluidCell[] fluidCells = { GT_MetaGenerated_Item_98.FluidCell.FLUORESCENT_DNA,
- GT_MetaGenerated_Item_98.FluidCell.ENZYME_SOLUTION, GT_MetaGenerated_Item_98.FluidCell.PENICILLIN,
- GT_MetaGenerated_Item_98.FluidCell.POLYMERASE, };
- for (int i = 0; i < fluidCells.length; i++) {
- BioLabFluidCells[i] = fluidCells[i].get();
- }
-
- FluidStack dnaFluid = Gendustry.isModLoaded() ? FluidRegistry.getFluidStack("liquiddna", 100)
- : Materials.Biomass.getFluid(100L);
- for (BioCulture B : BioCulture.BIO_CULTURE_ARRAY_LIST) {
- if (B.isBreedable()) {
- B.setFluid(
- GT_FluidFactory.builder(
- B.getName()
- .replace(" ", "")
- .toLowerCase() + "fluid")
- .withTextureName("molten.autogenerated")
- .withColorRGBA(
- new short[] { (short) B.getColor()
- .getRed(),
- (short) B.getColor()
- .getBlue(),
- (short) B.getColor()
- .getGreen() })
- .withLocalizedName(B.getLocalisedName() + " Fluid")
- .withStateAndTemperature(FluidState.LIQUID, 300)
- .buildAndRegister()
- .asFluid());
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(10))
- .fluidInputs(new FluidStack(B.getFluid(), 1000))
- .fluidOutputs(dnaFluid)
- .duration(25 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(centrifugeRecipes);
- }
- }
-
- bioFluidBlock = new BioFluidBlock();
- GameRegistry.registerBlock(bioFluidBlock, "coloredFluidBlock");
- GameRegistry.registerTileEntity(BWTileEntityDimIDBridge.class, "bwTEDimIDBridge");
- if (SideReference.Side.Client) {
- RendererSwitchingColorFluid.register();
- RendererGlasBlock.register();
- }
- }
-
- public static Fluid createAndRegisterFluid(String Name, Color color) {
- return GT_FluidFactory.builder(Name)
- .withTextureName("molten.autogenerated")
- .withColorRGBA(
- new short[] { (short) color.getRed(), (short) color.getGreen(), (short) color.getBlue(),
- (short) color.getAlpha() })
- .withStateAndTemperature(FluidState.LIQUID, 300)
- .buildAndRegister()
- .asFluid();
- }
-
- public static Fluid createAndRegisterFluid(String Name, Color color, int temperature) {
- return GT_FluidFactory.builder(Name)
- .withTextureName("molten.autogenerated")
- .withColorRGBA(
- new short[] { (short) color.getRed(), (short) color.getGreen(), (short) color.getBlue(),
- (short) color.getAlpha() })
- .withStateAndTemperature(FluidState.LIQUID, temperature)
- .buildAndRegister()
- .asFluid();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java
deleted file mode 100644
index 329d73023f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.Mods.BloodArsenal;
-import static gregtech.api.enums.Mods.Botania;
-import static gregtech.api.enums.Mods.Botany;
-import static gregtech.api.enums.Mods.Chisel;
-import static gregtech.api.enums.Mods.EnderIO;
-import static gregtech.api.enums.Mods.ExtraUtilities;
-import static gregtech.api.enums.Mods.GalaxySpace;
-import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
-import static gregtech.api.enums.Mods.IndustrialCraft2;
-import static gregtech.api.enums.Mods.Minecraft;
-import static gregtech.api.enums.Mods.Natura;
-import static gregtech.api.enums.Mods.Railcraft;
-import static gregtech.api.enums.Mods.RandomThings;
-import static gregtech.api.enums.Mods.TecTech;
-import static gregtech.api.enums.Mods.TinkerConstruct;
-import static gregtech.api.enums.Mods.Witchery;
-import static gregtech.api.enums.Mods.ZTones;
-
-import com.github.bartimaeusnek.bartworks.API.BioVatLogicAdder;
-
-/**
- * Autogenerated run file, script Created on Wed Jan 2 19:11:07 2019 by boubou_19 and bartimaeusnek Executed on
- * 2019-01-03 02:08:43 modified by bartimaeusnek to only add blocks that mods are loaded modified by bartimaeusnek on
- * 2020-03-22 00:20 to run statically modified by Quarri6343 on 2022-08-24 20:02 to add Botania Support
- */
-public class GTNHBlocks {
-
- public static void run() {
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Minecraft.ID, "stained_glass", i, 3);
- }
-
- BioVatLogicAdder.BioVatGlass.addCustomGlass(IndustrialCraft2.ID, "blockAlloyGlass", 0, 4);
-
- if (BloodArsenal.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(BloodArsenal.ID, "blood_stained_glass", 0, 3);
- }
- if (Botania.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Botania.ID, "manaGlass", 0, 4);
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Botania.ID, "elfGlass", 0, 5);
- }
- if (Botany.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Botany.ID, "stained", 0, 3);
- }
-
- if (Chisel.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "glass2", 0, 3);
-
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "glass", i, 3);
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "stained_glass_white", i, 3);
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "stained_glass_yellow", i, 3);
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "stained_glass_lightgray", i, 3);
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "stained_glass_brown", i, 3);
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Chisel.ID, "stained_glass_forestry", i, 3);
- }
- }
-
- if (EnderIO.isModLoaded()) {
- for (int i = 0; i <= 5; ++i) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(EnderIO.ID, "blockFusedQuartz", i, 3);
- }
- }
-
- if (ExtraUtilities.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(ExtraUtilities.ID, "decorativeBlock1", 9, 3);
- for (int i = 0; i < 12; ++i) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(ExtraUtilities.ID, "decorativeBlock2", i, 3);
- }
-
- for (int i = 0; i < 6; ++i) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(ExtraUtilities.ID, "etherealglass", i, 3);
-
- }
- }
-
- if (GalaxySpace.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(GalaxySpace.ID, "futureglass", 0, 3);
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(GalaxySpace.ID, "futureglasses", i, 3);
- }
- }
-
- if (HardcoreEnderExpansion.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(HardcoreEnderExpansion.ID, "laboratory_glass", 0, 3);
- }
-
- if (IndustrialCraft2.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Minecraft.ID, "glass", 0, 3);
- }
-
- if (Natura.isModLoaded()) {
- for (int i = 0; i <= 1; ++i) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Natura.ID, "NetherGlass", i, 3);
- }
- }
-
- if (Railcraft.isModLoaded()) {
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Railcraft.ID, "glass", i, 3);
- }
- }
-
- if (RandomThings.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(RandomThings.ID, "spectreGlass", 0, 3);
- }
-
- if (TinkerConstruct.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(TinkerConstruct.ID, "GlassBlock", 0, 3);
-
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(TinkerConstruct.ID, "GlassBlock.StainedClear", i, 3);
- }
- }
-
- if (TecTech.isModLoaded()) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(TecTech.ID, "tile.quantumGlass", 0, 8);
- }
-
- if (Witchery.isModLoaded()) {
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(Witchery.ID, "shadedglass", i, 3);
- }
- }
-
- if (ZTones.isModLoaded()) {
- for (int i = 0; i < 16; i++) {
- BioVatLogicAdder.BioVatGlass.addCustomGlass(ZTones.ID, "tile.glaxx", i, 3);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java
deleted file mode 100644
index 499686e6e0..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static com.github.bartimaeusnek.bartworks.MainMod.BWT;
-import static com.github.bartimaeusnek.bartworks.MainMod.GT2;
-import static gregtech.api.enums.Mods.GalactiGreg;
-import static gregtech.api.enums.Mods.TecTech;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_Blocks;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_GlasBlocks;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_GlasBlocks2;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_TileEntityContainer;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_TileEntityContainer_MachineBlock;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.items.BW_ItemBlocks;
-import com.github.bartimaeusnek.bartworks.common.items.BW_SimpleWindMeter;
-import com.github.bartimaeusnek.bartworks.common.items.BW_Stonage_Rotors;
-import com.github.bartimaeusnek.bartworks.common.items.Circuit_Programmer;
-import com.github.bartimaeusnek.bartworks.common.items.GT_Destructopack_Item;
-import com.github.bartimaeusnek.bartworks.common.items.GT_Rockcutter_Item;
-import com.github.bartimaeusnek.bartworks.common.items.GT_Teslastaff_Item;
-import com.github.bartimaeusnek.bartworks.common.items.SimpleIconItem;
-import com.github.bartimaeusnek.bartworks.common.items.SimpleSubItemClass;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BW_RotorBlock;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BW_TileEntity_ExperimentalFloodGate;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BW_TileEntity_HeatedWaterPump;
-import com.github.bartimaeusnek.bartworks.common.tileentities.debug.CreativeScanner;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_CircuitAssemblyLine;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_DEHP;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_ElectricImplosionCompressor;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_THTR;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega.GT_TileEntity_MegaBlastFurnace;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega.GT_TileEntity_MegaChemicalReactor;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega.GT_TileEntity_MegaDistillTower;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega.GT_TileEntity_MegaOilCracker;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega.GT_TileEntity_MegaVacuumFreezer;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_AcidGenerator;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_CompressedFluidHatch;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_Diode;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_EnergyDistributor;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_GiantOutputHatch;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_HumongousInputHatch;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.crossmod.galacticgreg.GT_TileEntity_VoidMiners;
-import com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered.TT_MetaTileEntity_LowPowerLaserBox;
-import com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered.TT_MetaTileEntity_LowPowerLaserDynamo;
-import com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered.TT_MetaTileEntity_LowPowerLaserHatch;
-import com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered.TT_MetaTileEntity_Pipe_Energy_LowPower;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-import fox.spiteful.avaritia.blocks.LudicrousBlocks;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import ic2.api.item.IKineticRotor;
-
-public class ItemRegistry {
-
- public static final Item DESTRUCTOPACK = new GT_Destructopack_Item();
- public static final Item TESLASTAFF = new GT_Teslastaff_Item();
- public static final Item ROCKCUTTER_LV = new GT_Rockcutter_Item(1);
- public static final Item ROCKCUTTER_MV = new GT_Rockcutter_Item(2);
- public static final Item ROCKCUTTER_HV = new GT_Rockcutter_Item(3);
- public static final Item CIRCUIT_PROGRAMMER = new Circuit_Programmer();
- public static final Block ROTORBLOCK = new BW_TileEntityContainer_MachineBlock(
- Material.wood,
- BW_RotorBlock.class,
- "BWRotorBlock");
- public static final Item LEATHER_ROTOR = new BW_Stonage_Rotors(
- 7,
- 0.15f,
- 5,
- 1.15f,
- 1,
- 50,
- 10000000,
- IKineticRotor.GearboxType.WIND,
- new ResourceLocation(MainMod.MOD_ID, "textures/items/rotors/rotorLeather.png"),
- "BW_LeatherRotor",
- "rotors/itemRotorLeather");
- public static final Item WOOL_ROTOR = new BW_Stonage_Rotors(
- 7,
- 0.18f,
- 3,
- 1.35f,
- 1,
- 50,
- 9000000,
- IKineticRotor.GearboxType.WIND,
- new ResourceLocation(MainMod.MOD_ID, "textures/items/rotors/rotorWool.png"),
- "BW_WoolRotor",
- "rotors/itemRotorWool");
- public static final Item PAPER_ROTOR = new BW_Stonage_Rotors(
- 7,
- 0.2f,
- 12,
- 0.9f,
- 1,
- 50,
- 800000,
- IKineticRotor.GearboxType.WIND,
- new ResourceLocation(MainMod.MOD_ID, "textures/items/rotors/rotorPaper.png"),
- "BW_PaperRotor",
- "rotors/itemRotorPaper");
- public static final Item COMBINED_ROTOR = new BW_Stonage_Rotors(
- 9,
- 0.22f,
- 7,
- 1.05f,
- 1,
- 50,
- 6000000,
- IKineticRotor.GearboxType.WIND,
- new ResourceLocation(MainMod.MOD_ID, "textures/items/rotors/rotorCombined.png"),
- "BW_CombinedRotor",
- "rotors/itemRotorCombined");
- public static final Item CRAFTING_PARTS = new SimpleSubItemClass(
- "grindstone_top",
- "grindstone_bottom",
- "completed_grindstone",
- "rotors/leatherParts",
- "rotors/woolParts",
- "rotors/paperParts",
- "rotors/combinedParts");
- public static final Item TAB = new SimpleIconItem("GT2Coin");
- public static final Item WINDMETER = new BW_SimpleWindMeter();
- public static final Block PUMPBLOCK = new BW_TileEntityContainer(
- Material.anvil,
- BW_TileEntity_HeatedWaterPump.class,
- "BWHeatedWaterPump");
- public static final Item PUMPPARTS = new SimpleSubItemClass("BWrawtube", "BWmotor");
- public static final Block EXPPUMP = new BW_TileEntityContainer(
- Material.coral,
- BW_TileEntity_ExperimentalFloodGate.class,
- "ExpReversePump");
-
- public static final Block bw_realglas = new BW_GlasBlocks(
- "BW_GlasBlocks",
- new String[] { MainMod.MOD_ID + ":BoronSilicateGlassBlock",
- MainMod.MOD_ID + ":TitaniumReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":TungstenSteelReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":LuVTierMaterialReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":IridiumReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":OsmiumReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":ColoredBoronSilicateGlassBlock1", MainMod.MOD_ID + ":ColoredBoronSilicateGlassBlock2",
- MainMod.MOD_ID + ":ColoredBoronSilicateGlassBlock3", MainMod.MOD_ID + ":ColoredBoronSilicateGlassBlock4",
- MainMod.MOD_ID + ":ColoredBoronSilicateGlassBlock5", MainMod.MOD_ID + ":ColoredBoronSilicateGlassBlock6",
- MainMod.MOD_ID + ":ThoriumYttriumGlass", MainMod.MOD_ID + ":NeutroniumReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":CosmicNeutroniumReinforcedBoronSilicateGlassBlock",
- MainMod.MOD_ID + ":InfinityReinforcedBoronSilicateGlassBlock", },
- new short[][] { Materials.BorosilicateGlass.getRGBA(), Materials.Titanium.getRGBA(),
- Materials.TungstenSteel.getRGBA(), Materials.Chrome.getRGBA(), Materials.Iridium.getRGBA(),
- Materials.Osmium.getRGBA(), new short[] { 0xff, 0, 0 }, new short[] { 0, 0xff, 0 },
- new short[] { 0x80, 0, 0xff }, new short[] { 0xff, 0xff, 0 }, new short[] { 0, 0xff, 0x80 },
- new short[] { 0x80, 0x33, 0 }, WerkstoffLoader.YttriumOxide.getRGBA(), Materials.Neutronium.getRGBA(),
- Materials.CosmicNeutronium.getRGBA(), new short[] { 0xda, 0xeb, 0xff }, },
- MainMod.BIO_TAB,
- true,
- false);
- public static final Block bw_realglas2 = new BW_GlasBlocks2(
- "BW_GlasBlocks2",
- new String[] { MainMod.MOD_ID + ":TranscendentallyReinforcedBoronSilicateGlassBlock" },
- new short[][] { new short[] { 50, 50, 50 } },
- MainMod.BIO_TAB,
- true,
- false);
-
- public static final Block[] bw_glasses = { bw_realglas, bw_realglas2 };
- public static final Block bw_fake_glasses = new BW_GlasBlocks(
- "BW_GlasBlocks",
- new String[] { MainMod.MOD_ID + ":BoronSilicateGlassBlockRandlos" },
- null,
- null,
- true,
- true);
- public static final Block bw_fake_glasses2 = new BW_GlasBlocks2(
- "BW_GlasBlocks2",
- new String[] { MainMod.MOD_ID + ":BoronSilicateGlassBlockRandlos" },
- null,
- null,
- true,
- true);
- public static final Block[] BW_BLOCKS = {
- new BW_Blocks(
- "BW_ItemBlocks",
- new String[] { MainMod.MOD_ID + ":EtchedLapisCell", MainMod.MOD_ID + ":PlatedLapisCell", },
- GT2),
- new BW_Blocks("GT_LESU_CASING", new String[] { MainMod.MOD_ID + ":LESU_CELL", }, GT2),
- new BW_Blocks(
- "BW_Machinery_Casings",
- new String[] { MainMod.MOD_ID + ":NickelFerriteBlocks", MainMod.MOD_ID + ":TransformerCoil",
- // MainMod.MOD_ID+":DEHP_Casing",
- // MainMod.MOD_ID+":DEHP_Casing_Base"
- },
- BWT), };
-
- public static ItemStack[] diode2A = new ItemStack[GT_Values.VN.length];
- public static ItemStack[] diode4A = new ItemStack[GT_Values.VN.length];
- public static ItemStack[] diode8A = new ItemStack[GT_Values.VN.length];
- public static ItemStack[] diode12A = new ItemStack[GT_Values.VN.length];
- public static ItemStack[] diode16A = new ItemStack[GT_Values.VN.length];
- public static ItemStack[] energyDistributor = new ItemStack[GT_Values.VN.length];
- public static ItemStack[] acidGens = new ItemStack[3];
- public static ItemStack acidGensLV;
- public static ItemStack[] megaMachines = new ItemStack[5];
- public static ItemStack dehp;
- public static ItemStack[] voidminer = new ItemStack[3];
- public static ItemStack THTR;
- public static ItemStack HTGR;
- public static ItemStack eic;
- public static ItemStack cal;
- public static ItemStack compressedHatch;
- public static ItemStack giantOutputHatch;
- public static ItemStack humongousInputHatch;
-
- public static ItemStack[][][] TecTechLaserAdditions = new ItemStack[3][4][4];
- public static ItemStack TecTechPipeEnergyLowPower;
-
- public static void run() {
- GameRegistry.registerBlock(ItemRegistry.bw_fake_glasses, "BW_FakeGlasBlock");
- GameRegistry.registerBlock(ItemRegistry.bw_fake_glasses2, "BW_FakeGlasBlocks2");
- GameRegistry.registerBlock(ItemRegistry.BW_BLOCKS[2], BW_ItemBlocks.class, "BW_Machinery_Casings");
- GameRegistry.registerItem(ItemRegistry.LEATHER_ROTOR, "BW_LeatherRotor");
- GameRegistry.registerItem(ItemRegistry.WOOL_ROTOR, "BW_WoolRotor");
- GameRegistry.registerItem(ItemRegistry.PAPER_ROTOR, "BW_PaperRotor");
- GameRegistry.registerItem(ItemRegistry.COMBINED_ROTOR, "BW_CombinedRotor");
- GameRegistry.registerItem(ItemRegistry.CRAFTING_PARTS, "craftingParts");
- GameRegistry.registerTileEntity(BW_RotorBlock.class, "BWRotorBlockTE");
- GameRegistry.registerBlock(ItemRegistry.ROTORBLOCK, BW_ItemBlocks.class, "BWRotorBlock");
- GameRegistry.registerTileEntity(BW_TileEntity_HeatedWaterPump.class, "BWHeatedWaterPumpTE");
- GameRegistry.registerBlock(ItemRegistry.PUMPBLOCK, BW_ItemBlocks.class, "BWHeatedWaterPumpBlock");
- GameRegistry.registerItem(ItemRegistry.PUMPPARTS, "BWPumpParts");
- GameRegistry.registerItem(ItemRegistry.WINDMETER, "BW_SimpleWindMeter");
- GameRegistry.registerTileEntity(BW_TileEntity_ExperimentalFloodGate.class, "BWExpReversePump");
- GameRegistry.registerBlock(ItemRegistry.EXPPUMP, BW_ItemBlocks.class, "BWExpReversePumpBlock");
-
- // GT2 stuff
- GameRegistry.registerBlock(ItemRegistry.BW_BLOCKS[0], BW_ItemBlocks.class, "BW_ItemBlocks");
- GameRegistry.registerBlock(ItemRegistry.BW_BLOCKS[1], BW_ItemBlocks.class, "GT_LESU_CASING");
- if (ConfigHandler.teslastaff)
- GameRegistry.registerItem(ItemRegistry.TESLASTAFF, ItemRegistry.TESLASTAFF.getUnlocalizedName());
-
- GameRegistry.registerItem(ItemRegistry.ROCKCUTTER_LV, ItemRegistry.ROCKCUTTER_LV.getUnlocalizedName());
- GameRegistry.registerItem(ItemRegistry.ROCKCUTTER_MV, ItemRegistry.ROCKCUTTER_MV.getUnlocalizedName());
- GameRegistry.registerItem(ItemRegistry.ROCKCUTTER_HV, ItemRegistry.ROCKCUTTER_HV.getUnlocalizedName());
- GameRegistry.registerItem(ItemRegistry.TAB, "tabIconGT2");
-
- if (ConfigHandler.creativeScannerID != 0) new CreativeScanner(
- ConfigHandler.creativeScannerID,
- "Creative Debug Scanner",
- "Creative Debug Scanner",
- 20);
- ItemRegistry.eic = new GT_TileEntity_ElectricImplosionCompressor(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 6,
- "ElectricImplosionCompressor",
- "Electric Implosion Compressor").getStackForm(1L);
-
- // EIC depend on neutronium block to pass on structure updates
- int bitmask = GregTech_API.sMachineIDs.getOrDefault(GregTech_API.sBlockMetal5, 0) | 1 << 2;
- GregTech_API.registerMachineBlock(GregTech_API.sBlockMetal5, bitmask);
-
- // Also spacetime, transcendent metal, and universium
- bitmask = GregTech_API.sMachineIDs.getOrDefault(GregTech_API.sBlockMetal9, 0) | 1 << 3 | 1 << 4 | 1 << 8;
- GregTech_API.registerMachineBlock(GregTech_API.sBlockMetal9, bitmask);
-
- // Also infinity
- bitmask = GregTech_API.sMachineIDs.getOrDefault(LudicrousBlocks.resource_block, 0) | 1 << 1;
- GregTech_API.registerMachineBlock(LudicrousBlocks.resource_block, bitmask);
-
- ItemRegistry.THTR = new GT_TileEntity_THTR(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 5,
- "THTR",
- "Thorium High Temperature Reactor").getStackForm(1L);
- GT_TileEntity_THTR.THTRMaterials.registeraTHR_Materials();
- ItemRegistry.HTGR = new GT_TileEntity_HTGR(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 15 + 48,
- "HTGR",
- "High Temperature Gas-cooled Reactor").getStackForm(1L);
- GT_TileEntity_HTGR.HTGRMaterials.registeraTHR_Materials();
-
- // ID ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 15 + 49 IS TAKEN !!! (12792)
-
- GT_OreDictUnificator
- .add(OrePrefixes.block, Materials.BorosilicateGlass, new ItemStack(ItemRegistry.bw_glasses[0], 1, 0));
- GT_OreDictUnificator
- .registerOre(OrePrefixes.block, Materials.NickelZincFerrite, new ItemStack(ItemRegistry.BW_BLOCKS[2]));
- for (int i = 0; i < GT_Values.VN.length - 1; i++) {
- ItemRegistry.diode2A[i] = new GT_MetaTileEntity_Diode(
- ConfigHandler.IDOffset + GT_Values.VN.length + 1 + i,
- "diode" + "2A" + GT_Values.VN[i],
- StatCollector.translateToLocal("tile.diode.name") + " 2A " + GT_Values.VN[i],
- i).getStackForm(1L);
- ItemRegistry.diode4A[i] = new GT_MetaTileEntity_Diode(
- ConfigHandler.IDOffset + GT_Values.VN.length * 2 + 1 + i,
- "diode" + "4A" + GT_Values.VN[i],
- StatCollector.translateToLocal("tile.diode.name") + " 4A " + GT_Values.VN[i],
- i).getStackForm(1L);
- ItemRegistry.diode8A[i] = new GT_MetaTileEntity_Diode(
- ConfigHandler.IDOffset + GT_Values.VN.length * 3 + 1 + i,
- "diode" + "8A" + GT_Values.VN[i],
- StatCollector.translateToLocal("tile.diode.name") + " 8A " + GT_Values.VN[i],
- i).getStackForm(1L);
- ItemRegistry.diode12A[i] = new GT_MetaTileEntity_Diode(
- ConfigHandler.IDOffset + GT_Values.VN.length * 4 + 1 + i,
- "diode" + "12A" + GT_Values.VN[i],
- StatCollector.translateToLocal("tile.diode.name") + " 12A " + GT_Values.VN[i],
- i).getStackForm(1L);
- ItemRegistry.diode16A[i] = new GT_MetaTileEntity_Diode(
- ConfigHandler.IDOffset + GT_Values.VN.length * 5 + 1 + i,
- "diode" + "16A" + GT_Values.VN[i],
- StatCollector.translateToLocal("tile.diode.name") + " 16A " + GT_Values.VN[i],
- i).getStackForm(1L);
- ItemRegistry.energyDistributor[i] = new GT_MetaTileEntity_EnergyDistributor(
- ConfigHandler.IDOffset + 1 + i,
- "energydistributor" + GT_Values.VN[i],
- StatCollector.translateToLocal("tile.energydistributor.name") + " " + GT_Values.VN[i],
- i).getStackForm(1L);
- }
- for (int i = 0; i < 3; i++) {
- ItemRegistry.acidGens[i] = new GT_MetaTileEntity_AcidGenerator(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 - 2 + i,
- "acidgenerator" + GT_Values.VN[i + 2],
- StatCollector.translateToLocal("tile.acidgenerator.name") + " " + GT_Values.VN[i + 2],
- i + 2).getStackForm(1);
- }
-
- ItemRegistry.acidGensLV = new GT_MetaTileEntity_AcidGenerator(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 65,
- "acidgenerator" + GT_Values.VN[1],
- StatCollector.translateToLocal("tile.acidgenerator.name") + " " + GT_Values.VN[1],
- +1).getStackForm(1L);
-
- ItemRegistry.dehp = new GT_TileEntity_DEHP(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 1,
- 1,
- "DEHP",
- "Deep Earth Heating Pump").getStackForm(1L);
- ItemRegistry.megaMachines[0] = new GT_TileEntity_MegaBlastFurnace(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 2,
- "MegaBlastFurnace",
- StatCollector.translateToLocal("tile.bw.mbf.name")).getStackForm(1L);
- ItemRegistry.megaMachines[1] = new GT_TileEntity_MegaVacuumFreezer(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 3,
- "MegaVacuumFreezer",
- StatCollector.translateToLocal("tile.bw.mvf.name")).getStackForm(1L);
- ItemRegistry.cal = new GT_TileEntity_CircuitAssemblyLine(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 7,
- "CircuitAssemblyLine",
- "Circuit Assembly Line").getStackForm(1L);
- ItemRegistry.compressedHatch = new GT_MetaTileEntity_CompressedFluidHatch(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 8,
- "CompressedFluidHatch",
- "Liquid Air Fluid Hatch").getStackForm(1L);
- ItemRegistry.giantOutputHatch = new GT_MetaTileEntity_GiantOutputHatch(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 9,
- "GiantOutputHatch",
- "Giant Output Hatch").getStackForm(1L);
- ItemRegistry.humongousInputHatch = new GT_MetaTileEntity_HumongousInputHatch(
- ConfigHandler.IDOffset + GT_Values.VN.length * 9 + 55,
- "HumongousInputHatch",
- "Humongous Input Hatch").getStackForm(1L);
- ItemRegistry.megaMachines[2] = new GT_TileEntity_MegaDistillTower(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 10,
- "MegaDistillationTower",
- "Mega Distillation Tower").getStackForm(1L);
- ItemRegistry.megaMachines[3] = new GT_TileEntity_MegaChemicalReactor(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 638,
- "MegaChemicalReactor",
- "Mega Chemical Reactor").getStackForm(1L);
- ItemRegistry.megaMachines[4] = new GT_TileEntity_MegaOilCracker(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 639,
- "MegaOilCracker",
- "Mega Oil Cracker").getStackForm(1L);
-
- if (GalactiGreg.isModLoaded()) {
- ItemRegistry.voidminer[2] = new GT_TileEntity_VoidMiners.VMUV(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 11,
- "VoidMiner3",
- "Void Miner III").getStackForm(1L);
- ItemRegistry.voidminer[1] = new GT_TileEntity_VoidMiners.VMZPM(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 12,
- "VoidMiner2",
- "Void Miner II").getStackForm(1L);
- ItemRegistry.voidminer[0] = new GT_TileEntity_VoidMiners.VMLUV(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 13,
- "VoidMiner1",
- "Void Miner I").getStackForm(1L);
- }
- if (TecTech.isModLoaded()) {
- TecTechPipeEnergyLowPower = new TT_MetaTileEntity_Pipe_Energy_LowPower(
- ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 14,
- "pipe.lowpowerlaser",
- "Low Power Laser Pipe").getStackForm(1L);
- int startID = ConfigHandler.IDOffset + GT_Values.VN.length * 8 + 15;
- for (int amps = 32; amps <= 128; amps += 32) {
- for (int tier = 4; tier < 8; tier++) {
- TecTechLaserAdditions[0][amps / 32 - 1][tier - 4] = new TT_MetaTileEntity_LowPowerLaserBox(
- startID,
- GT_Values.VN[tier] + "_LPLaser_Converter_" + amps,
- GT_Values.VN[tier] + " " + amps + "A/t" + " Low Power Laser Converter",
- tier,
- amps).getStackForm(1L);
- startID++;
- }
- }
- for (int amps = 32; amps <= 128; amps += 32) {
- for (int tier = 4; tier < 8; tier++) {
- TecTechLaserAdditions[1][amps / 32 - 1][tier - 4] = new TT_MetaTileEntity_LowPowerLaserHatch(
- startID,
- GT_Values.VN[tier] + "_LPLaser_Hatch_" + amps,
- GT_Values.VN[tier] + " " + amps + "A/t" + " Low Power Laser Target Hatch",
- tier,
- amps).getStackForm(1L);
- startID++;
- }
- }
- for (int amps = 32; amps <= 128; amps += 32) {
- for (int tier = 4; tier < 8; tier++) {
- TecTechLaserAdditions[2][amps / 32 - 1][tier - 4] = new TT_MetaTileEntity_LowPowerLaserDynamo(
- startID,
- GT_Values.VN[tier] + "_LPLaser_Dynamo_" + amps,
- GT_Values.VN[tier] + " " + amps + "A/t" + " Low Power Laser Source Hatch",
- tier,
- amps).getStackForm(1L);
- startID++;
- }
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java
deleted file mode 100644
index 020f89e703..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import gregtech.api.util.GT_LanguageManager;
-
-public class LocalisationLoader {
-
- private LocalisationLoader() {}
-
- private static void localiseTooltips() {
- GT_LanguageManager
- .addStringLocalization("metaitem.01.tooltip.purify.2", "Throw into Cauldron to get clean crushed Ore");
- GT_LanguageManager
- .addStringLocalization("metaitem.01.tooltip.nqgen", "Can be used as Enriched Naquadah Fuel Substitute");
- }
-
- private static void localiseAchivements() {
- GT_LanguageManager
- .addStringLocalization("achievement.gt.blockmachines.electricimplosioncompressor", "Electric Implosions?");
- GT_LanguageManager.addStringLocalization(
- "achievement.gt.blockmachines.electricimplosioncompressor.desc",
- "Basically a giant Hammer that presses Stuff - No more TNT!");
- GT_LanguageManager.addStringLocalization("achievement.gt.blockmachines.dehp", "Heat from below!");
- GT_LanguageManager
- .addStringLocalization("achievement.gt.blockmachines.dehp.desc", "Get ALL the thermal energy!");
- GT_LanguageManager
- .addStringLocalization("achievement.gt.blockmachines.circuitassemblyline", "Cheaper Circuits?");
- GT_LanguageManager.addStringLocalization(
- "achievement.gt.blockmachines.circuitassemblyline.desc",
- "Well, yes, but actually no...");
- GT_LanguageManager.addStringLocalization("achievement.gt.blockmachines.voidminer1", "Ores from deep below!");
- GT_LanguageManager
- .addStringLocalization("achievement.gt.blockmachines.voidminer1.desc", "Is this some kind of Ex-Nihilo?");
- GT_LanguageManager.addStringLocalization(
- "achievement.gt.blockmachines.voidminer2",
- "Ores from deep below 2! Electric Boogaloo!");
- GT_LanguageManager
- .addStringLocalization("achievement.gt.blockmachines.voidminer2.desc", "Ex-Nihilo, but faster!");
- GT_LanguageManager.addStringLocalization(
- "achievement.gt.blockmachines.voidminer3",
- "Ores from deep below 3! Trinity Ex-Nihilo");
- GT_LanguageManager
- .addStringLocalization("achievement.gt.blockmachines.voidminer3.desc", "3x the trouble, 3x the fun!");
- }
-
- public static void localiseAll() {
- localiseAchivements();
- localiseTooltips();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java
deleted file mode 100644
index d141fe8b65..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static gregtech.api.enums.Mods.IndustrialCraft2;
-
-import com.github.bartimaeusnek.bartworks.system.material.BW_NonMeta_MaterialItems;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.BWRecipes;
-
-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 RadioHatchMaterialLoader {
-
- public static void run() {
-
- for (Werkstoff material : Werkstoff.werkstoffHashSet) {
- if (material != null && material.getStats()
- .isRadioactive()) {
- int level = (int) material.getStats()
- .getProtons();
- short[] rgba = material.getRGBA();
- if (material.hasItemType(OrePrefixes.stick))
- BWRecipes.instance.addRadHatch(material.get(OrePrefixes.stick), level, 1, rgba);
- if (material.hasItemType(OrePrefixes.stickLong))
- BWRecipes.instance.addRadHatch(material.get(OrePrefixes.stickLong), level, 2, rgba);
- }
- }
-
- for (Materials material : Materials.getAll()) {
- if (material == null || material.mElement == null) continue;
- boolean validProton = material.getProtons() >= 83 && !material.equals(Materials.Tritanium) // No Tritanium
- && !material.equals(Materials.Naquadah); // Naquadah needs spacial value
- if (validProton) {
- int level = (int) material.getProtons();
- short[] rgba = material.getRGBA();
- if (GT_OreDictUnificator.get(OrePrefixes.stick, material, 1) != null) BWRecipes.instance
- .addRadHatch(GT_OreDictUnificator.get(OrePrefixes.stick, material, 1), level, 1, rgba);
- if (GT_OreDictUnificator.get(OrePrefixes.stickLong, material, 1) != null) BWRecipes.instance
- .addRadHatch(GT_OreDictUnificator.get(OrePrefixes.stickLong, material, 1), level, 2, rgba);
- }
- }
-
- Materials[] spacialMaterial = { Materials.Naquadah, Materials.NaquadahEnriched, Materials.Naquadria };
- int[] spacialValue = { 130, 140, 150 };
-
- for (int i = 0; i < spacialMaterial.length; i++) {
- if (GT_OreDictUnificator.get(OrePrefixes.stick, spacialMaterial[i], 1) != null)
- BWRecipes.instance.addRadHatch(
- GT_OreDictUnificator.get(OrePrefixes.stick, spacialMaterial[i], 1),
- spacialValue[i],
- 1,
- spacialMaterial[i].mRGBa);
- if (GT_OreDictUnificator.get(OrePrefixes.stickLong, spacialMaterial[i], 1) != null)
- BWRecipes.instance.addRadHatch(
- GT_OreDictUnificator.get(OrePrefixes.stickLong, spacialMaterial[i], 1),
- spacialValue[i],
- 2,
- spacialMaterial[i].mRGBa);
- }
-
- BWRecipes.instance.addRadHatch(
- ItemList.ThoriumCell_1.get(1),
- (int) Materials.Thorium.getProtons(),
- 3,
- Materials.Thorium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.ThoriumCell_2.get(1),
- (int) Materials.Thorium.getProtons(),
- 6,
- Materials.Thorium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.ThoriumCell_4.get(1),
- (int) Materials.Thorium.getProtons(),
- 12,
- Materials.Thorium.mRGBa);
-
- BWRecipes.instance.addRadHatch(ItemList.NaquadahCell_1.get(1), 140, 3, Materials.NaquadahEnriched.mRGBa);
- BWRecipes.instance.addRadHatch(ItemList.NaquadahCell_2.get(1), 140, 6, Materials.NaquadahEnriched.mRGBa);
- BWRecipes.instance.addRadHatch(ItemList.NaquadahCell_4.get(1), 140, 12, Materials.NaquadahEnriched.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- ItemList.Moxcell_1.get(1),
- (int) Materials.Plutonium.getProtons(),
- 3,
- Materials.Plutonium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.Moxcell_2.get(1),
- (int) Materials.Plutonium.getProtons(),
- 6,
- Materials.Plutonium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.Moxcell_4.get(1),
- (int) Materials.Plutonium.getProtons(),
- 12,
- Materials.Plutonium.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- ItemList.Uraniumcell_1.get(1),
- (int) Materials.Uranium.getProtons(),
- 3,
- Materials.Uranium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.Uraniumcell_2.get(1),
- (int) Materials.Uranium.getProtons(),
- 6,
- Materials.Uranium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.Uraniumcell_4.get(1),
- (int) Materials.Uranium.getProtons(),
- 12,
- Materials.Uranium.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- BW_NonMeta_MaterialItems.TiberiumCell_1.get(1),
- (int) WerkstoffLoader.Tiberium.getBridgeMaterial()
- .getProtons(),
- 3,
- WerkstoffLoader.Tiberium.getRGBA());
- BWRecipes.instance.addRadHatch(
- BW_NonMeta_MaterialItems.TiberiumCell_2.get(1),
- (int) WerkstoffLoader.Tiberium.getBridgeMaterial()
- .getProtons(),
- 6,
- WerkstoffLoader.Tiberium.getRGBA());
- BWRecipes.instance.addRadHatch(
- BW_NonMeta_MaterialItems.TiberiumCell_4.get(1),
- (int) WerkstoffLoader.Tiberium.getBridgeMaterial()
- .getProtons(),
- 12,
- WerkstoffLoader.Tiberium.getRGBA());
-
- BWRecipes.instance
- .addRadHatch(BW_NonMeta_MaterialItems.TheCoreCell.get(1), 140, 96, Materials.NaquadahEnriched.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- ItemList.Depleted_Thorium_1.get(1),
- (int) Materials.Thorium.getProtons() / 10,
- 3,
- Materials.Thorium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.Depleted_Thorium_2.get(1),
- (int) Materials.Thorium.getProtons() / 10,
- 6,
- Materials.Thorium.mRGBa);
- BWRecipes.instance.addRadHatch(
- ItemList.Depleted_Thorium_4.get(1),
- (int) Materials.Thorium.getProtons() / 10,
- 12,
- Materials.Thorium.mRGBa);
-
- BWRecipes.instance
- .addRadHatch(ItemList.Depleted_Naquadah_1.get(1), 140 / 10, 3, Materials.NaquadahEnriched.mRGBa);
- BWRecipes.instance
- .addRadHatch(ItemList.Depleted_Naquadah_2.get(1), 140 / 10, 6, Materials.NaquadahEnriched.mRGBa);
- BWRecipes.instance
- .addRadHatch(ItemList.Depleted_Naquadah_4.get(1), 140 / 10, 12, Materials.NaquadahEnriched.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorMOXSimpledepleted", 1),
- (int) Materials.Plutonium.getProtons() / 10,
- 3,
- Materials.Plutonium.mRGBa);
- BWRecipes.instance.addRadHatch(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorMOXDualdepleted", 1),
- (int) Materials.Plutonium.getProtons() / 10,
- 6,
- Materials.Plutonium.mRGBa);
- BWRecipes.instance.addRadHatch(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorMOXQuaddepleted", 1),
- (int) Materials.Plutonium.getProtons() / 10,
- 12,
- Materials.Plutonium.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorUraniumSimpledepleted", 1),
- (int) Materials.Uranium.getProtons() / 10,
- 3,
- Materials.Uranium.mRGBa);
- BWRecipes.instance.addRadHatch(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorUraniumDualdepleted", 1),
- (int) Materials.Uranium.getProtons() / 10,
- 6,
- Materials.Uranium.mRGBa);
- BWRecipes.instance.addRadHatch(
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "reactorUraniumQuaddepleted", 1),
- (int) Materials.Uranium.getProtons() / 10,
- 12,
- Materials.Uranium.mRGBa);
-
- BWRecipes.instance.addRadHatch(
- BW_NonMeta_MaterialItems.Depleted_Tiberium_1.get(1),
- (int) WerkstoffLoader.Tiberium.getBridgeMaterial()
- .getProtons() / 10,
- 3,
- WerkstoffLoader.Tiberium.getRGBA());
- BWRecipes.instance.addRadHatch(
- BW_NonMeta_MaterialItems.Depleted_Tiberium_2.get(1),
- (int) WerkstoffLoader.Tiberium.getBridgeMaterial()
- .getProtons() / 10,
- 6,
- WerkstoffLoader.Tiberium.getRGBA());
- BWRecipes.instance.addRadHatch(
- BW_NonMeta_MaterialItems.Depleted_Tiberium_4.get(1),
- (int) WerkstoffLoader.Tiberium.getBridgeMaterial()
- .getProtons() / 10,
- 12,
- WerkstoffLoader.Tiberium.getRGBA());
-
- BWRecipes.instance
- .addRadHatch(BW_NonMeta_MaterialItems.Depleted_TheCoreCell.get(1), 130 / 10, 96, Materials.Naquadah.mRGBa);
-
- BWRecipes.instance.addRadHatch(ItemList.MNqCell_1.get(1), 150, 3, Materials.Naquadria.mRGBa);
- BWRecipes.instance.addRadHatch(ItemList.MNqCell_2.get(1), 150, 6, Materials.Naquadria.mRGBa);
- BWRecipes.instance.addRadHatch(ItemList.MNqCell_4.get(1), 150, 12, Materials.Naquadria.mRGBa);
-
- BWRecipes.instance.addRadHatch(ItemList.Depleted_MNq_1.get(1), 150 / 10, 3, Materials.Naquadria.mRGBa);
- BWRecipes.instance.addRadHatch(ItemList.Depleted_MNq_2.get(1), 150 / 10, 6, Materials.Naquadria.mRGBa);
- BWRecipes.instance.addRadHatch(ItemList.Depleted_MNq_4.get(1), 150 / 10, 12, Materials.Naquadria.mRGBa);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java
deleted file mode 100644
index c55561687b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Assembler;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.AssemblyLine;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Autoclave;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Centrifuge;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.ChemicalBath;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.ChemicalReactor;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.CraftingRecipes;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Electrolyzer;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Extractor;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.FakeRecipes;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.FluidHeater;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.FluidSolidifier;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.FormingPress;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.LaserEngraver;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Mixer;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.Pulverizer;
-import com.github.bartimaeusnek.bartworks.common.loaders.recipes.PyrolyseOven;
-
-import gregtech.api.util.GT_ModHandler;
-
-public class RecipeLoader {
-
- public static final long BITSD = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
- | GT_ModHandler.RecipeBits.REVERSIBLE;
-
- public static void run() {
- new Assembler().run();
- new AssemblyLine().run();
- new Autoclave().run();
- new Centrifuge().run();
- new ChemicalBath().run();
- new ChemicalReactor().run();
- new CraftingRecipes().run();
- new Electrolyzer().run();
- new Extractor().run();
- new FakeRecipes().run();
- new FluidHeater().run();
- new FluidSolidifier().run();
- new FormingPress().run();
- new LaserEngraver().run();
- new Mixer().run();
- new Pulverizer().run();
- new PyrolyseOven().run();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java
deleted file mode 100644
index 615eed0c43..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import com.github.bartimaeusnek.bartworks.common.commands.ChangeConfig;
-import com.github.bartimaeusnek.bartworks.common.commands.ClearCraftingCache;
-import com.github.bartimaeusnek.bartworks.common.commands.GetWorkingDirectory;
-import com.github.bartimaeusnek.bartworks.common.commands.PrintRecipeListToFile;
-import com.github.bartimaeusnek.bartworks.common.commands.RunGC;
-import com.github.bartimaeusnek.bartworks.common.commands.SummonRuin;
-
-import cpw.mods.fml.common.event.FMLServerStartingEvent;
-
-public class RegisterServerCommands {
-
- public static void registerAll(FMLServerStartingEvent event) {
- event.registerServerCommand(new SummonRuin());
- event.registerServerCommand(new ChangeConfig());
- event.registerServerCommand(new PrintRecipeListToFile());
- event.registerServerCommand(new ClearCraftingCache());
- event.registerServerCommand(new GetWorkingDirectory());
- event.registerServerCommand(new RunGC());
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java
deleted file mode 100644
index 6f50650484..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.loaders;
-
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.ANAEROBE_GAS;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.NOBLE_GAS;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.fluids;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.molten;
-import static gregtech.api.enums.GT_Values.VN;
-import static gregtech.api.enums.Mods.TinkerConstruct;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-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 net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidContainerRegistry;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.oredict.OreDictionary;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.API.recipe.DynamicGTRecipe;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.StreamUtils;
-import com.github.bartimaeusnek.bartworks.util.log.DebugLog;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-import com.google.common.collect.ArrayListMultimap;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-import gnu.trove.map.hash.TObjectDoubleHashMap;
-import gregtech.api.enums.Element;
-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.objects.GT_ItemStack;
-import gregtech.api.recipe.RecipeMap;
-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;
-
-public class StaticRecipeChangeLoaders {
-
- private static TObjectDoubleHashMap<Materials> gtEbfGasRecipeTimeMultipliers = null;
- private static TObjectDoubleHashMap<Materials> gtEbfGasRecipeConsumptionMultipliers = null;
-
- public static final List<ItemStack> whitelistForEBFNoGasRecipeDontCheckItemData = Arrays
- .asList(GT_ModHandler.getModItem(TinkerConstruct.ID, "materials", 1L, 12) // Raw Aluminum -> Aluminium Ingot
- // (coremod)
- );
-
- private StaticRecipeChangeLoaders() {}
-
- public static void addEBFGasRecipes() {
- if (gtEbfGasRecipeTimeMultipliers == null) {
- // For Werkstoff gases, use Werkstoff.Stats.setEbfGasRecipeTimeMultiplier
- gtEbfGasRecipeTimeMultipliers = new TObjectDoubleHashMap<>(10, 0.5F, -1.0D); // keep default value as -1
- // Example to make Argon cut recipe times into a third of the original:
- // gtEbfGasRecipeTimeMultipliers.put(Materials.Argon, 1.0D / 3.0D);
-
- gtEbfGasRecipeTimeMultipliers.put(Materials.Nitrogen, 1.0D);
- gtEbfGasRecipeTimeMultipliers.put(Materials.Helium, 0.9D);
- gtEbfGasRecipeTimeMultipliers.put(Materials.Argon, 0.8D);
- gtEbfGasRecipeTimeMultipliers.put(Materials.Radon, 0.7D);
- }
- if (gtEbfGasRecipeConsumptionMultipliers == null) {
- // For Werkstoff gases, use Werkstoff.Stats.setEbfGasRecipeConsumedAmountMultiplier
- gtEbfGasRecipeConsumptionMultipliers = new TObjectDoubleHashMap<>(10, 0.5F, 1.0D); // keep default value as
- // 1
- // Example to make Argon recipes use half the gas amount of the primary recipe (1000L->500L, 2000L->1000L
- // etc.):
- // gtEbfGasRecipeConsumptionMultipliers.put(Materials.Argon, 1.0D / 2.0D);
- gtEbfGasRecipeConsumptionMultipliers.put(Materials.Nitrogen, 1.0D);
- gtEbfGasRecipeConsumptionMultipliers.put(Materials.Helium, 1.0D);
- gtEbfGasRecipeConsumptionMultipliers.put(Materials.Argon, 0.85D);
- gtEbfGasRecipeConsumptionMultipliers.put(Materials.Radon, 0.7D);
- }
- ArrayListMultimap<SubTag, GT_Recipe> toChange = getRecipesToChange(NOBLE_GAS, ANAEROBE_GAS);
- editRecipes(toChange, getNoGasItems(toChange));
- }
-
- public static void fixEnergyRequirements() {
- RecipeMap.ALL_RECIPE_MAPS.values()
- .stream()
- .filter(StreamUtils::filterVisualMaps)
- .forEach(
- recipeMap -> recipeMap.getAllRecipes()
- .parallelStream()
- .forEach(gt_recipe -> {
- for (int i = 0; i < VN.length - 1; i++) {
- if (gt_recipe.mEUt > BW_Util.getMachineVoltageFromTier(i)
- && gt_recipe.mEUt <= BW_Util.getTierVoltage(i)) {
- gt_recipe.mEUt = BW_Util.getMachineVoltageFromTier(i);
- }
- }
- }));
- }
-
- public static void unificationRecipeEnforcer() {
- for (Werkstoff werkstoff : Werkstoff.werkstoffHashSet) {
- StaticRecipeChangeLoaders.runMaterialLinker(werkstoff);
- if (werkstoff.getGenerationFeatures().enforceUnification) {
- HashSet<String> oreDictNames = new HashSet<>(werkstoff.getADDITIONAL_OREDICT());
- oreDictNames.add(werkstoff.getVarName());
- StaticRecipeChangeLoaders.runMoltenUnificationEnfocement(werkstoff);
- StaticRecipeChangeLoaders.runUnficationDeleter(werkstoff);
- for (String s : oreDictNames) for (OrePrefixes prefixes : OrePrefixes.values()) {
- if (!werkstoff.hasItemType(prefixes)) continue;
- String fullOreName = prefixes + s;
- List<ItemStack> ores = OreDictionary.getOres(fullOreName, false);
- if (ores.size() <= 1) // empty or one entry, i.e. no unification needed
- continue;
- for (ItemStack toReplace : ores) {
- ItemStack replacement = werkstoff.get(prefixes);
- if (toReplace == null || GT_Utility.areStacksEqual(toReplace, replacement)
- || replacement == null
- || replacement.getItem() == null) continue;
- for (RecipeMap<?> map : RecipeMap.ALL_RECIPE_MAPS.values()) {
- List<GT_Recipe> toRemove = new ArrayList<>();
- nextRecipe: for (GT_Recipe recipe : map.getAllRecipes()) {
- boolean removal = map.equals(RecipeMaps.fluidExtractionRecipes)
- || map.equals(RecipeMaps.fluidSolidifierRecipes);
- for (int i = 0; i < recipe.mInputs.length; i++) {
- if (!GT_Utility.areStacksEqual(recipe.mInputs[i], toReplace)) continue;
- if (removal) {
- toRemove.add(recipe);
- continue nextRecipe;
- }
- recipe.mInputs[i] = GT_Utility.copyAmount(recipe.mInputs[i].stackSize, replacement);
- }
- for (int i = 0; i < recipe.mOutputs.length; i++) {
- if (!GT_Utility.areStacksEqual(recipe.mOutputs[i], toReplace)) continue;
- if (removal) {
- toRemove.add(recipe);
- continue nextRecipe;
- }
- recipe.mOutputs[i] = GT_Utility
- .copyAmount(recipe.mOutputs[i].stackSize, replacement);
- }
- if (recipe.mSpecialItems instanceof ItemStack specialItemStack) {
- if (!GT_Utility.areStacksEqual(specialItemStack, toReplace)) continue;
- if (removal) {
- toRemove.add(recipe);
- continue nextRecipe;
- }
- recipe.mSpecialItems = GT_Utility
- .copyAmount(specialItemStack.stackSize, replacement);
- }
- }
- map.getBackend()
- .removeRecipes(toRemove);
- }
- }
- }
- }
- }
- }
-
- private static void runMoltenUnificationEnfocement(Werkstoff werkstoff) {
- if (werkstoff.getGenerationFeatures().enforceUnification && werkstoff.hasItemType(OrePrefixes.cellMolten)) {
- try {
- FluidContainerRegistry.FluidContainerData data = new FluidContainerRegistry.FluidContainerData(
- new FluidStack(Objects.requireNonNull(molten.get(werkstoff)), 144),
- werkstoff.get(OrePrefixes.cellMolten),
- Materials.Empty.getCells(1));
- Field f = GT_Utility.class.getDeclaredField("sFilledContainerToData");
- f.setAccessible(true);
- @SuppressWarnings("unchecked")
- Map<GT_ItemStack, FluidContainerRegistry.FluidContainerData> sFilledContainerToData = (Map<GT_ItemStack, FluidContainerRegistry.FluidContainerData>) f
- .get(null);
- Set<Map.Entry<GT_ItemStack, FluidContainerRegistry.FluidContainerData>> toremFilledContainerToData = new HashSet<>();
- ItemStack toReplace = null;
- for (Map.Entry<GT_ItemStack, FluidContainerRegistry.FluidContainerData> entry : sFilledContainerToData
- .entrySet()) {
- final String MODID = GameRegistry.findUniqueIdentifierFor(data.filledContainer.getItem()).modId;
- if (MainMod.MOD_ID.equals(MODID) || BartWorksCrossmod.MOD_ID.equals(MODID)) continue;
- if (entry.getValue().fluid.equals(data.fluid)
- && !entry.getValue().filledContainer.equals(data.filledContainer)) {
- toReplace = entry.getValue().filledContainer;
- toremFilledContainerToData.add(entry);
- }
- }
- sFilledContainerToData.entrySet()
- .removeAll(toremFilledContainerToData);
- Set<GT_Recipe> toremRecipeList = new HashSet<>();
- if (toReplace != null) {
- for (RecipeMap<?> map : RecipeMap.ALL_RECIPE_MAPS.values()) {
- toremRecipeList.clear();
- for (GT_Recipe recipe : map.getAllRecipes()) {
- for (ItemStack mInput : recipe.mInputs) {
- if (GT_Utility.areStacksEqual(mInput, toReplace)) {
- toremRecipeList.add(recipe);
- // recipe.mInputs[i] = data.filledContainer;
- }
- }
- for (ItemStack mOutput : recipe.mOutputs) {
- if (GT_Utility.areStacksEqual(mOutput, toReplace)) {
- toremRecipeList.add(recipe);
- // recipe.mOutputs[i] = data.filledContainer;
- if (map == RecipeMaps.fluidCannerRecipes
- && GT_Utility.areStacksEqual(mOutput, data.filledContainer)
- && !recipe.mFluidInputs[0].equals(data.fluid)) {
- toremRecipeList.add(recipe);
- // recipe.mOutputs[i] = data.filledContainer;
- }
- }
- }
- if (recipe.mSpecialItems instanceof ItemStack
- && GT_Utility.areStacksEqual((ItemStack) recipe.mSpecialItems, toReplace)) {
- toremRecipeList.add(recipe);
- // recipe.mSpecialItems = data.filledContainer;
- }
- }
- map.getBackend()
- .removeRecipes(toremRecipeList);
- }
- }
- GT_Utility.addFluidContainerData(data);
- } catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) {
- e.printStackTrace();
- }
- }
- }
-
- private static void runUnficationDeleter(Werkstoff werkstoff) {
- if (werkstoff.getType() == Werkstoff.Types.ELEMENT && werkstoff.getBridgeMaterial() != null
- && Element.get(werkstoff.getToolTip()) != Element._NULL) {
- werkstoff.getBridgeMaterial().mElement = Element.get(werkstoff.getToolTip());
- Element.get(werkstoff.getToolTip()).mLinkedMaterials = new ArrayList<>();
- Element.get(werkstoff.getToolTip()).mLinkedMaterials.add(werkstoff.getBridgeMaterial());
- }
-
- for (OrePrefixes prefixes : OrePrefixes.values()) if (werkstoff.hasItemType(prefixes)) {
- GT_OreDictUnificator.set(prefixes, werkstoff.getBridgeMaterial(), werkstoff.get(prefixes), true, true);
- for (ItemStack stack : OreDictionary.getOres(prefixes + werkstoff.getVarName())) {
- GT_OreDictUnificator.addAssociation(prefixes, werkstoff.getBridgeMaterial(), stack, false);
- GT_OreDictUnificator.getAssociation(stack).mUnificationTarget = werkstoff.get(prefixes);
- }
- }
- }
-
- private static void runMaterialLinker(Werkstoff werkstoff) {
- if (werkstoff.getType() == Werkstoff.Types.ELEMENT && werkstoff.getBridgeMaterial() != null
- && Element.get(werkstoff.getToolTip()) != Element._NULL) {
- werkstoff.getBridgeMaterial().mElement = Element.get(werkstoff.getToolTip());
- Element.get(werkstoff.getToolTip()).mLinkedMaterials = new ArrayList<>();
- Element.get(werkstoff.getToolTip()).mLinkedMaterials.add(werkstoff.getBridgeMaterial());
- }
-
- for (OrePrefixes prefixes : OrePrefixes.values())
- if (werkstoff.hasItemType(prefixes) && werkstoff.getBridgeMaterial() != null) {
- GT_OreDictUnificator.set(prefixes, werkstoff.getBridgeMaterial(), werkstoff.get(prefixes), true, true);
- for (ItemStack stack : OreDictionary.getOres(prefixes + werkstoff.getVarName())) {
- GT_OreDictUnificator.addAssociation(prefixes, werkstoff.getBridgeMaterial(), stack, false);
- }
- }
- }
-
- /**
- * Constructs a list of recipes to change by scanning all EBF recipes for uses of noble gases.
- *
- * @param GasTags list of gas tags to look out for in EBF recipes
- * @return A multimap from the gas tag (noble and/or anaerobic) to all the recipes containing a gas with that tag
- */
- private static ArrayListMultimap<SubTag, GT_Recipe> getRecipesToChange(SubTag... GasTags) {
- ArrayListMultimap<SubTag, GT_Recipe> toAdd = ArrayListMultimap.create();
- for (GT_Recipe recipe : RecipeMaps.blastFurnaceRecipes.getAllRecipes()) {
- if (recipe.mFluidInputs != null && recipe.mFluidInputs.length > 0) {
- Materials mat = getMaterialFromInputFluid(recipe);
- if (mat != Materials._NULL) {
- for (SubTag tag : GasTags) {
- if (mat.contains(tag)) {
- DebugLog.log(
- "Found EBF Recipe to change, Output:"
- + BW_Util.translateGTItemStack(recipe.mOutputs[0]));
- toAdd.put(tag, recipe);
- }
- }
- }
- }
- }
- return toAdd;
- }
-
- /**
- * Scans EBF recipes for no-gas variants of the recipes present in base. Adds these recipes to the base multimap.
- *
- * @param base The recipe multimap to scan and modify
- * @return Set of item outputs (recipe.mOutputs[0]) of the no-gas recipes
- */
- private static HashSet<ItemStack> getNoGasItems(ArrayListMultimap<SubTag, GT_Recipe> base) {
- HashSet<ItemStack> toAdd = new HashSet<>();
- ArrayListMultimap<SubTag, GT_Recipe> repToAdd = ArrayListMultimap.create();
- for (GT_Recipe recipe : RecipeMaps.blastFurnaceRecipes.getAllRecipes()) {
- for (SubTag tag : base.keySet()) recipeLoop: for (GT_Recipe baseRe : base.get(tag)) {
- if (recipe.mInputs.length == baseRe.mInputs.length && recipe.mOutputs.length == baseRe.mOutputs.length)
- for (int i = 0; i < recipe.mInputs.length; i++) {
- ItemStack tmpInput = recipe.mInputs[i];
- if ((recipe.mFluidInputs == null || recipe.mFluidInputs.length == 0)
- && (whitelistForEBFNoGasRecipeDontCheckItemData.stream()
- .anyMatch(s -> GT_Utility.areStacksEqual(s, tmpInput))
- || BW_Util.checkStackAndPrefix(recipe.mInputs[i])
- && BW_Util.checkStackAndPrefix(baseRe.mInputs[i])
- && GT_OreDictUnificator.getAssociation(recipe.mInputs[i]).mMaterial.mMaterial
- .equals(
- GT_OreDictUnificator.getAssociation(baseRe.mInputs[i]).mMaterial.mMaterial)
- && GT_Utility.areStacksEqual(recipe.mOutputs[0], baseRe.mOutputs[0]))) {
- toAdd.add(recipe.mOutputs[0]);
- repToAdd.put(tag, recipe);
- continue recipeLoop;
- }
- }
- }
- }
- base.putAll(repToAdd);
- return toAdd;
- }
-
- private static int transformEBFGasRecipeTime(int originalDuration, long originalGasProtons, long newGasProtons) {
- double protonTerm = originalGasProtons * (newGasProtons >= originalGasProtons ? 1.0D : 2.75D) - newGasProtons;
- return Math.max(1, (int) (originalDuration / 200D * Math.max(200D + protonTerm, 1D)));
- }
-
- private static int transformEBFGasRecipeTime(GT_Recipe recipe, Materials originalGas, Materials newGas) {
- double newEbfMul = gtEbfGasRecipeTimeMultipliers.get(newGas);
- double originalEbfMul = gtEbfGasRecipeTimeMultipliers.get(originalGas);
- if (newEbfMul < 0.0D || originalEbfMul < 0.0D) {
- return transformEBFGasRecipeTime(recipe.mDuration, originalGas.getProtons(), newGas.getProtons());
- }
- return Math.max(1, (int) (recipe.mDuration * newEbfMul / originalEbfMul));
- }
-
- private static int transformEBFGasRecipeTime(GT_Recipe recipe, Materials originalGas, Werkstoff newGas) {
- double newEbfMul = newGas.getStats()
- .getEbfGasRecipeTimeMultiplier();
- double originalEbfMul = gtEbfGasRecipeTimeMultipliers.get(originalGas);
- if (newEbfMul < 0.0D || originalEbfMul < 0.0D) {
- return transformEBFGasRecipeTime(
- recipe.mDuration,
- originalGas.getProtons(),
- newGas.getStats()
- .getProtons());
- }
- return Math.max(1, (int) (recipe.mDuration * newEbfMul / originalEbfMul));
- }
-
- private static int transformEBFNoGasRecipeTime(GT_Recipe recipe, Materials originalGas) {
- return transformEBFGasRecipeTime(recipe.mDuration, originalGas.getProtons(), 0);
- }
-
- private static void editEBFMaterialRecipes(SubTag GasTag, GT_Recipe recipe, Materials originalGas,
- HashSet<GT_Recipe> toAdd) {
- for (Materials newGas : Materials.values()) {
- if (newGas.contains(GasTag)) {
- int time = transformEBFGasRecipeTime(recipe, originalGas, newGas);
- int gasAmount = Math.max(
- 1,
- (int) Math.round(recipe.mFluidInputs[0].amount * gtEbfGasRecipeConsumptionMultipliers.get(newGas)));
- if (recipe.mFluidInputs != null && recipe.mFluidInputs.length == 1
- && recipe.mFluidInputs[0].isFluidEqual(newGas.getGas(0))) {
- // preserve original recipe owner
- toAdd.add(
- new DynamicGTRecipe(
- false,
- recipe.mInputs,
- recipe.mOutputs,
- recipe.mSpecialItems,
- recipe.mChances,
- new FluidStack[] { newGas.getGas(gasAmount) },
- recipe.mFluidOutputs,
- time,
- recipe.mEUt,
- recipe.mSpecialValue,
- recipe));
- } else {
- // new recipe
- toAdd.add(
- new GT_Recipe(
- false,
- recipe.mInputs,
- recipe.mOutputs,
- recipe.mSpecialItems,
- recipe.mChances,
- new FluidStack[] { newGas.getGas(gasAmount) },
- recipe.mFluidOutputs,
- time,
- recipe.mEUt,
- recipe.mSpecialValue));
- }
- }
- }
- }
-
- private static void editEBFWerkstoffRecipes(SubTag GasTag, GT_Recipe recipe, Materials originalGas,
- HashSet<GT_Recipe> toAdd) {
- for (Werkstoff newGas : Werkstoff.werkstoffHashMap.values()) {
- if (newGas.contains(GasTag)) {
- int time = transformEBFGasRecipeTime(recipe, originalGas, newGas);
- int gasAmount = Math.max(
- 1,
- (int) Math.round(
- recipe.mFluidInputs[0].amount * newGas.getStats()
- .getEbfGasRecipeConsumedAmountMultiplier()));
- if (recipe.mFluidInputs != null && recipe.mFluidInputs.length == 1
- && recipe.mFluidInputs[0]
- .isFluidEqual(new FluidStack(Objects.requireNonNull(fluids.get(newGas)), 0))) {
- // preserve original recipe owner
- toAdd.add(
- new DynamicGTRecipe(
- false,
- recipe.mInputs,
- recipe.mOutputs,
- recipe.mSpecialItems,
- recipe.mChances,
- new FluidStack[] { new FluidStack(Objects.requireNonNull(fluids.get(newGas)), gasAmount) },
- recipe.mFluidOutputs,
- time,
- recipe.mEUt,
- recipe.mSpecialValue,
- recipe));
- } else {
- // new recipe
- toAdd.add(
- new GT_Recipe(
- false,
- recipe.mInputs,
- recipe.mOutputs,
- recipe.mSpecialItems,
- recipe.mChances,
- new FluidStack[] { new FluidStack(Objects.requireNonNull(fluids.get(newGas)), gasAmount) },
- recipe.mFluidOutputs,
- time,
- recipe.mEUt,
- recipe.mSpecialValue));
- }
- }
- }
- }
-
- private static void editEBFNoGasRecipes(GT_Recipe recipe, Materials originalGas, HashSet<GT_Recipe> toAdd,
- HashSet<ItemStack> noGas) {
- for (ItemStack is : noGas) {
- byte circuitConfiguration = 1;
- if (GT_Utility.areStacksEqual(is, recipe.mOutputs[0])) {
- ArrayList<ItemStack> inputs = new ArrayList<>(recipe.mInputs.length);
- for (ItemStack stack : recipe.mInputs)
- if (!GT_Utility.areStacksEqual(GT_Utility.getIntegratedCircuit(11), stack)
- && !GT_Utility.areStacksEqual(GT_Utility.getIntegratedCircuit(14), stack)
- && !GT_Utility.areStacksEqual(GT_Utility.getIntegratedCircuit(19), stack)) {
- if (BW_Util.checkStackAndPrefix(stack)) circuitConfiguration = (byte) (OrePrefixes.dustSmall
- .equals(GT_OreDictUnificator.getAssociation(stack).mPrefix)
- ? 4
- : OrePrefixes.dustTiny.equals(GT_OreDictUnificator.getAssociation(stack).mPrefix)
- ? 9
- : 1);
- inputs.add(stack);
- }
- inputs.add(GT_Utility.getIntegratedCircuit(circuitConfiguration));
- toAdd.add(
- new DynamicGTRecipe(
- false,
- inputs.toArray(new ItemStack[0]),
- recipe.mOutputs,
- recipe.mSpecialItems,
- recipe.mChances,
- null,
- recipe.mFluidOutputs,
- transformEBFNoGasRecipeTime(recipe, originalGas),
- recipe.mEUt,
- recipe.mSpecialValue,
- recipe));
- break;
- }
- }
- }
-
- private static void removeDuplicateGasRecipes(HashSet<GT_Recipe> toAdd) {
- HashSet<GT_Recipe> duplicates = new HashSet<>();
- for (GT_Recipe recipe : toAdd) {
- for (GT_Recipe recipe2 : toAdd) {
- if (recipe.mEUt != recipe2.mEUt || recipe.mDuration != recipe2.mDuration
- || recipe.mSpecialValue != recipe2.mSpecialValue
- || recipe == recipe2
- || recipe.mInputs.length != recipe2.mInputs.length
- || recipe.mFluidInputs.length != recipe2.mFluidInputs.length) continue;
- boolean isSame = true;
- for (int i = 0; i < recipe.mInputs.length; i++) {
- if (!GT_Utility.areStacksEqual(recipe.mInputs[i], recipe2.mInputs[i])) isSame = false;
- }
- for (int i = 0; i < recipe.mFluidInputs.length; i++) {
- if (!GT_Utility.areFluidsEqual(recipe.mFluidInputs[i], recipe2.mFluidInputs[i])) isSame = false;
- }
- if (isSame) duplicates.add(recipe2);
- }
- }
- toAdd.removeAll(duplicates);
- }
-
- private static Materials getMaterialFromInputFluid(GT_Recipe recipe) {
- String materialString = recipe.mFluidInputs[0].getFluid()
- .getName();
- materialString = StringUtils.removeStart(materialString, "molten");
- materialString = StringUtils.removeStart(materialString, "fluid");
- materialString = StringUtils.capitalize(materialString);
- return Materials.get(materialString);
- }
-
- private static void editRecipes(ArrayListMultimap<SubTag, GT_Recipe> base, HashSet<ItemStack> noGas) {
- HashSet<GT_Recipe> toAdd = new HashSet<>();
-
- for (SubTag gasTag : base.keySet()) {
- for (GT_Recipe recipe : base.get(gasTag)) {
- if (recipe.mFluidInputs != null && recipe.mFluidInputs.length > 0) {
- Materials originalGas = getMaterialFromInputFluid(recipe);
- if (originalGas != Materials._NULL) {
- editEBFWerkstoffRecipes(gasTag, recipe, originalGas, toAdd);
- editEBFMaterialRecipes(gasTag, recipe, originalGas, toAdd);
- editEBFNoGasRecipes(recipe, originalGas, toAdd, noGas);
- }
- }
- }
- RecipeMaps.blastFurnaceRecipes.getBackend()
- .removeRecipes(base.get(gasTag));
- }
-
- removeDuplicateGasRecipes(toAdd);
- toAdd.forEach(RecipeMaps.blastFurnaceRecipes::add);
- }
-
- public static void addElectricImplosionCompressorRecipes() {
- RecipeMaps.implosionRecipes.getAllRecipes()
- .stream()
- .filter(e -> e.mInputs != null)
- .forEach(
- recipe -> BartWorksRecipeMaps.electricImplosionCompressorRecipes.addRecipe(
- true,
- Arrays.stream(recipe.mInputs)
- .filter(e -> !StaticRecipeChangeLoaders.checkForExplosives(e))
- .distinct()
- .toArray(ItemStack[]::new),
- recipe.mOutputs,
- null,
- null,
- null,
- 1,
- (int) TierEU.RECIPE_UEV,
- 0));
-
- // Custom EIC recipes.
- new ElectricImplosionCompressorRecipes().run();
- }
-
- private static boolean checkForExplosives(ItemStack input) {
- return GT_Utility.areStacksEqual(input, new ItemStack(Blocks.tnt))
- || GT_Utility.areStacksEqual(input, GT_ModHandler.getIC2Item("industrialTnt", 1L))
- || GT_Utility.areStacksEqual(input, GT_ModHandler.getIC2Item("dynamite", 1L))
- || GT_Utility.areStacksEqual(input, ItemList.Block_Powderbarrel.get(1L));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java
deleted file mode 100644
index 8f152c00c7..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java
+++ /dev/null
@@ -1,294 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.enums.Mods.GregTech;
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.HOURS;
-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.FluidRegistry;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-
-public class Assembler implements Runnable {
-
- @Override
- public void run() {
- Materials[] cables = { // Cable material used in the acid gen, diode and energy distributor below
- Materials.Lead, // ULV
- Materials.Tin, // LV
- Materials.AnnealedCopper, // MV
- Materials.Gold, // HV
- Materials.Aluminium, // EV
- Materials.Tungsten, // IV
- Materials.VanadiumGallium, // LuV
- Materials.Naquadah, // ZPM
- Materials.NaquadahAlloy, // UV
- Materials.SuperconductorUV // UHV
- };
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(ItemRegistry.BW_BLOCKS[0], 1, 0),
- Materials.Lapis.getPlates(9),
- GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2L),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(new ItemStack(ItemRegistry.BW_BLOCKS[0], 1, 1))
- .fluidInputs(FluidRegistry.getFluidStack("ic2coolant", 1000))
- .duration(5 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(ItemRegistry.BW_BLOCKS[0], 1, 1),
- Materials.Lapis.getBlocks(8),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(new ItemStack(ItemRegistry.BW_BLOCKS[1]))
- .duration(5 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 64, 1000),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.megaMachines[0])
- .fluidInputs(Materials.SolderingAlloy.getMolten(9216))
- .duration(1 * HOURS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 64, 1002),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.megaMachines[1])
- .fluidInputs(Materials.SolderingAlloy.getMolten(9216))
- .duration(1 * HOURS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 64, 1126),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.megaMachines[2])
- .fluidInputs(Materials.SolderingAlloy.getMolten(9216))
- .duration(1 * HOURS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 64, 1169),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.megaMachines[3])
- .fluidInputs(Materials.SolderingAlloy.getMolten(9216))
- .duration(1 * HOURS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 64, 1160),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.megaMachines[4])
- .fluidInputs(Materials.SolderingAlloy.getMolten(9216))
- .duration(1 * HOURS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.AnnealedCopper, 64L),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(new ItemStack(ItemRegistry.BW_BLOCKS[2], 1, 1))
- .fluidInputs(Materials.Plastic.getMolten(1152L))
- .duration(1 * TICKS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1L),
- Materials.Aluminium.getPlates(1),
- ItemList.Circuit_Board_Plastic.get(1L),
- ItemList.Battery_RE_LV_Lithium.get(1L))
- .itemOutputs(new ItemStack(ItemRegistry.CIRCUIT_PROGRAMMER))
- .fluidInputs(Materials.SolderingAlloy.getMolten(288L))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- ItemList.Circuit_Parts_GlassFiber.get(32),
- GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 8),
- WerkstoffLoader.CubicZirconia.get(OrePrefixes.gemExquisite, 2))
- .itemOutputs(
- new ItemStack(
- ItemRegistry.TecTechPipeEnergyLowPower.getItem(),
- 1,
- ItemRegistry.TecTechPipeEnergyLowPower.getItemDamage()))
- .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(72))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_EV)
- .addTo(assemblerRecipes);
-
- ItemStack[][] converters = ItemRegistry.TecTechLaserAdditions[0];
- ItemStack[][] input = ItemRegistry.TecTechLaserAdditions[1];
- ItemStack[][] dynamo = ItemRegistry.TecTechLaserAdditions[2];
-
- ItemList[] emitters = { ItemList.Emitter_EV, ItemList.Emitter_IV, ItemList.Emitter_LuV, ItemList.Emitter_ZPM };
-
- ItemList[] sensors = { ItemList.Sensor_EV, ItemList.Sensor_IV, ItemList.Sensor_LuV, ItemList.Sensor_ZPM };
-
- OrePrefixes[] prefixes = { OrePrefixes.cableGt04, OrePrefixes.cableGt08, OrePrefixes.cableGt12,
- OrePrefixes.cableGt16 };
-
- for (int j = 0; j < 4; j++) {
- for (int i = 0; i < 4; i++) {
- ItemStack converter = converters[j][i];
- ItemStack eInput = input[j][i];
- ItemStack eDynamo = dynamo[j][i];
- long recipeConsumption;
- switch (i) {
- case 0:
- recipeConsumption = TierEU.RECIPE_EV;
- break;
- case 1:
- recipeConsumption = TierEU.RECIPE_IV;
- break;
- case 2:
- recipeConsumption = TierEU.RECIPE_LuV;
- break;
- case 3:
- recipeConsumption = TierEU.RECIPE_ZPM;
- break;
- default:
- recipeConsumption = TierEU.RECIPE_EV;
- break;
- }
-
- int solderingAmount = Math.max(144 * i, 72) * (j + 1);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
-
- new ItemStack(
- ItemRegistry.TecTechPipeEnergyLowPower.getItem(),
- ((j + 1) * 16),
- ItemRegistry.TecTechPipeEnergyLowPower.getItemDamage()),
- WerkstoffLoader.CubicZirconia.get(OrePrefixes.lens),
- GT_OreDictUnificator.get(prefixes[j], cables[i + 4], 8),
- emitters[i].get(2 * (j + 1)),
- sensors[i].get(2 * (j + 1)),
- ItemList.TRANSFORMERS[4 + i].get(2 * (j + 1)))
- .itemOutputs(converter)
- .fluidInputs(Materials.SolderingAlloy.getMolten(solderingAmount))
- .duration((10 * (j + 1)) * SECONDS)
- .eut(recipeConsumption)
- .addTo(assemblerRecipes);
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(
- ItemRegistry.TecTechPipeEnergyLowPower.getItem(),
- ((j + 1) * 16),
- ItemRegistry.TecTechPipeEnergyLowPower.getItemDamage()),
- WerkstoffLoader.CubicZirconia.get(OrePrefixes.lens),
- GT_OreDictUnificator.get(prefixes[j], cables[i + 4], 8),
- emitters[i].get(2 * (j + 1)),
- sensors[i].get(2 * (j + 1)),
- ItemList.TRANSFORMERS[4 + i].get(2 * (j + 1)))
- .itemOutputs(converter)
- .fluidInputs(Materials.SolderingAlloy.getMolten(solderingAmount))
- .duration((10 * (j + 1)) * SECONDS)
- .eut(recipeConsumption)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(
- ItemRegistry.TecTechPipeEnergyLowPower.getItem(),
- (j + 1) * 16,
- ItemRegistry.TecTechPipeEnergyLowPower.getItemDamage()),
- WerkstoffLoader.CubicZirconia.get(OrePrefixes.lens),
- GT_OreDictUnificator.get(prefixes[j], cables[i + 4], 8),
- sensors[i].get(2 * (j + 1)),
- ItemList.HATCHES_ENERGY[4 + i].get(2 * (j + 1)))
- .itemOutputs(eInput)
- .fluidInputs(Materials.SolderingAlloy.getMolten(solderingAmount))
- .duration((10 * (j + 1)) * SECONDS)
- .eut(recipeConsumption)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(
- ItemRegistry.TecTechPipeEnergyLowPower.getItem(),
- (j + 1) * 16,
- ItemRegistry.TecTechPipeEnergyLowPower.getItemDamage()),
- WerkstoffLoader.CubicZirconia.get(OrePrefixes.lens),
- GT_OreDictUnificator.get(prefixes[j], cables[i + 4], 8),
- emitters[i].get(2 * (j + 1)),
- ItemList.HATCHES_DYNAMO[4 + i].get(2 * (j + 1)))
- .itemOutputs(eDynamo)
- .fluidInputs(Materials.SolderingAlloy.getMolten(solderingAmount))
- .duration((10 * (j + 1) * SECONDS))
- .eut(recipeConsumption)
- .addTo(assemblerRecipes);
- }
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- ItemList.Hatch_Input_HV.get(64),
- Materials.LiquidAir.getCells(1),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.compressedHatch.copy())
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Hatch_Output_HV.get(64), GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(ItemRegistry.giantOutputHatch.copy())
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 6),
- GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
- .itemOutputs(new ItemStack(GregTech_API.sBlockCasings3, 1, 12))
- .fluidInputs(Materials.Concrete.getMolten(1296))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_IV)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GregTech_API.sBlockCasings3, 1, 12),
- GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Europium, 6),
- GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Europium, 24))
- .itemOutputs(new ItemStack(GregTech_API.sBlockCasings8, 1, 5))
- .fluidInputs(Materials.Lead.getMolten(864))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_LuV)
- .addTo(assemblerRecipes);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java
deleted file mode 100644
index 538195362a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.enums.Mods.GalactiGreg;
-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.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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 AssemblyLine implements Runnable {
-
- @Override
- public void run() {
- Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
- ? FluidRegistry.getFluid("molten.indalloy140")
- : FluidRegistry.getFluid("molten.solderingalloy");
- GT_Values.RA.stdBuilder()
- .metadata(RESEARCH_ITEM, ItemList.Pump_IV.get(1L))
- .metadata(RESEARCH_TIME, 1 * HOURS)
- .itemInputs(
- ItemList.Pump_IV.get(16),
- GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Ultimate, 32L),
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.HSSE, 16L),
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.HSSE, 16L),
- ItemList.Field_Generator_LuV.get(8))
- .fluidInputs(
- new FluidStack(solderIndalloy, 32 * 144),
- Materials.Polytetrafluoroethylene.getMolten(32 * 144))
- .itemOutputs(ItemRegistry.dehp)
- .eut(TierEU.RECIPE_LuV)
- .duration(4 * MINUTES + 10 * SECONDS)
- .addTo(AssemblyLine);
-
- if (GalactiGreg.isModLoaded()) {
- GT_Values.RA.stdBuilder()
- .metadata(RESEARCH_ITEM, ItemList.OreDrill4.get(1L))
- .metadata(RESEARCH_TIME, 25 * MINUTES + 36 * SECONDS)
- .itemInputs(
- ItemList.OreDrill4.get(1L),
- GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 9L),
- Materials.Europium.getPlates(3),
- ItemList.Electric_Motor_LuV.get(9L),
- ItemList.Sensor_LuV.get(9L),
- ItemList.Field_Generator_LuV.get(9L),
- GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Europium, 36L))
- .fluidInputs(new FluidStack(solderIndalloy, 1440), WerkstoffLoader.Neon.getFluidOrGas(20000))
- .itemOutputs(ItemRegistry.voidminer[0].copy())
- .eut(TierEU.RECIPE_LuV)
- .duration(5 * MINUTES)
- .addTo(AssemblyLine);
- }
-
- GT_Values.RA.stdBuilder()
- .metadata(RESEARCH_ITEM, ItemList.Machine_LuV_CircuitAssembler.get(1L))
- .metadata(RESEARCH_TIME, 20 * MINUTES)
- .itemInputs(
- ItemList.Machine_LuV_CircuitAssembler.get(1L),
- ItemList.Robot_Arm_LuV.get(4L),
- ItemList.Electric_Motor_LuV.get(4L),
- ItemList.Field_Generator_LuV.get(1L),
- ItemList.Emitter_LuV.get(1L),
- ItemList.Sensor_LuV.get(1L),
- WerkstoffLoader.LuVTierMaterial.get(OrePrefixes.plate, 8))
- .fluidInputs(new FluidStack(solderIndalloy, 1440))
- .itemOutputs(ItemRegistry.cal.copy())
- .eut(TierEU.RECIPE_LuV)
- .duration(20 * MINUTES)
- .addTo(AssemblyLine);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java
deleted file mode 100644
index 1793877df3..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TierEU;
-
-public class Autoclave implements Runnable {
-
- @Override
- public void run() {
- Materials[] sterilizers = { Materials.Ammonia, Materials.Chlorine, Materials.Ethanol, Materials.Methanol };
- for (Materials used : sterilizers) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Circuit_Parts_PetriDish.get(1L))
- .itemOutputs(BioItemList.getPetriDish(null))
- .fluidInputs(used.getGas(10L) != null ? used.getGas(8L) : used.getFluid(16L))
- .duration(5 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(autoclaveRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(Items.glass_bottle))
- .itemOutputs(BioItemList.getDNASampleFlask(null))
- .fluidInputs(used.getGas(10L) != null ? used.getGas(8L) : used.getFluid(16L))
- .duration(5 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(autoclaveRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java
deleted file mode 100644
index e148376b01..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR.HTGRMaterials.MATERIALS_PER_FUEL;
-import static com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR.HTGRMaterials.sHTGR_Fuel;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import java.util.Arrays;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioCultureLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_THTR;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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_RecipeBuilder;
-import gregtech.api.util.GT_Utility;
-
-public class Centrifuge implements Runnable {
-
- @Override
- public void run() {
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Thorium.getDust(1))
- .itemOutputs(
- Materials.Thorium.getDust(1),
- Materials.Thorium.getDust(1),
- WerkstoffLoader.Thorium232.get(OrePrefixes.dust, 1),
- WerkstoffLoader.Thorium232.get(OrePrefixes.dust, 1),
- WerkstoffLoader.Thorium232.get(OrePrefixes.dust, 1))
- .outputChances(800, 375, 22, 22, 5)
- .duration(8 * MINUTES + 20 * SECONDS)
- .eut(TierEU.RECIPE_EV)
- .addTo(centrifugeRecipes);
-
- ItemStack[] pellets = new ItemStack[6];
- Arrays.fill(pellets, new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 64, 4));
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 3),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(pellets)
- .duration(40 * MINUTES)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 5),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 64, 6))
- .duration(40 * MINUTES)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 6))
- .itemOutputs(Materials.Lead.getDust(1))
- .outputChances(300)
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- int i = 0;
- for (GT_TileEntity_HTGR.HTGRMaterials.Fuel_ fuel : sHTGR_Fuel) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 3),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 64, i + 4),
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 64, i + 4),
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 64, i + 4),
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 64, i + 4))
- .duration(10 * MINUTES)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 5),
- GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 64, i + 6))
- .duration(2 * MINUTES + 30 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 6))
- .itemOutputs(
- fuel.recycledItems[0],
- fuel.recycledItems[1],
- fuel.recycledItems[2],
- fuel.recycledItems[3],
- fuel.recycledItems[4])
- .outputChances(fuel.recycleChances);
- if (fuel.recycledFluid != null) {
- recipeBuilder.fluidOutputs(fuel.recycledFluid);
- }
- recipeBuilder.duration(1 * MINUTES)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- i += MATERIALS_PER_FUEL;
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(BioItemList.getOther(4))
- .fluidInputs(new FluidStack(BioCultureLoader.eColi.getFluid(), 1000))
- .fluidOutputs(new FluidStack(FluidLoader.BioLabFluidMaterials[1], 10))
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(17))
- .fluidInputs(new FluidStack(FluidLoader.BioLabFluidMaterials[1], 1000))
- .fluidOutputs(new FluidStack(FluidLoader.BioLabFluidMaterials[3], 250))
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(17))
- .fluidInputs(new FluidStack(BioCultureLoader.CommonYeast.getFluid(), 1000))
- .fluidOutputs(new FluidStack(FluidLoader.BioLabFluidMaterials[2], 10))
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(centrifugeRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java
deleted file mode 100644
index f1d9ddd236..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-
-import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-
-public class ChemicalBath implements Runnable {
-
- @Override
- public void run() {
-
- for (int i = 0; i < Dyes.dyeBrown.getSizeOfFluidList(); ++i) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 6))
- .fluidInputs(Dyes.dyeRed.getFluidDye(i, 36))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 7))
- .fluidInputs(Dyes.dyeGreen.getFluidDye(i, 36))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 8))
- .fluidInputs(Dyes.dyePurple.getFluidDye(i, 36))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 9))
- .fluidInputs(Dyes.dyeYellow.getFluidDye(i, 36))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 10))
- .fluidInputs(Dyes.dyeLime.getFluidDye(i, 36))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 11))
- .fluidInputs(Dyes.dyeBrown.getFluidDye(i, 36))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- }
-
- for (int i = 6; i < 11; i++) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, i))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .fluidInputs(Materials.Chlorine.getGas(50))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(2)
- .addTo(chemicalBathRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java
deleted file mode 100644
index 87aaf91f71..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-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.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_Utility;
-
-public class ChemicalReactor implements Runnable {
-
- @Override
- public void run() {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(10))
- .fluidInputs(new FluidStack(FluidLoader.heatedfulvicAcid, 1000))
- .fluidOutputs(new FluidStack(FluidLoader.Kerogen, 1000))
- .duration(3 * SECONDS + 15 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(UniversalChemical);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java
deleted file mode 100644
index 17a5d5b025..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java
+++ /dev/null
@@ -1,462 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.enums.Mods.IndustrialCraft2;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.common.loaders.RecipeLoader;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_BioVat;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_LESU;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_ManualTrafo;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_Windmill;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_BioLab;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_RadioHatch;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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.ISubTagContainer;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import ic2.core.Ic2Items;
-
-public class CraftingRecipes implements Runnable {
-
- @Override
- public void run() {
-
- Materials[] cables = { // Cable material used in the acid gen, diode and energy distributor below
- Materials.Lead, // ULV
- Materials.Tin, // LV
- Materials.AnnealedCopper, // MV
- Materials.Gold, // HV
- Materials.Aluminium, // EV
- Materials.Tungsten, // IV
- Materials.VanadiumGallium, // LuV
- Materials.Naquadah, // ZPM
- Materials.NaquadahAlloy, // UV
- Materials.SuperconductorUV // UHV
- };
-
- ISubTagContainer[] hulls = { // Plate material used in the acid gen, diode and energy distributor below
- Materials.WroughtIron, // ULV
- Materials.Steel, // LV
- Materials.Aluminium, // MV
- Materials.StainlessSteel, // HV
- Materials.Titanium, // EV
- Materials.TungstenSteel, // IV
- WerkstoffLoader.LuVTierMaterial, // LuV
- Materials.Iridium, // ZPM
- Materials.Osmium, // UV
- Materials.Naquadah // UHV
- };
-
- ItemStack[] bats = { ItemList.Battery_Hull_LV.get(1L), ItemList.Battery_Hull_MV.get(1L),
- ItemList.Battery_Hull_HV.get(1L) };
- ItemStack[] chreac = { ItemList.Machine_MV_ChemicalReactor.get(1L), ItemList.Machine_HV_ChemicalReactor.get(1L),
- ItemList.Machine_EV_ChemicalReactor.get(1L) };
-
- GT_ModHandler.addCraftingRecipe(
- new GT_TileEntity_LESU(ConfigHandler.IDOffset, "LESU", "L.E.S.U.").getStackForm(1L),
- RecipeLoader.BITSD,
- new Object[] { "CDC", "SBS", "CFC", 'C', "circuitAdvanced", 'D', ItemList.Cover_Screen.get(1L), 'S',
- GT_OreDictUnificator.get(OrePrefixes.cableGt12, Materials.Platinum, 1L), 'B',
- new ItemStack(ItemRegistry.BW_BLOCKS[1]), 'F', ItemList.Field_Generator_HV.get(1L) });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.DESTRUCTOPACK),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "CPC", "PLP", "CPC", 'C', "circuitAdvanced", 'P',
- GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 1L), 'L',
- new ItemStack(Items.lava_bucket) });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.DESTRUCTOPACK),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "CPC", "PLP", "CPC", 'C', "circuitAdvanced", 'P',
- GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Steel, 1L), 'L',
- new ItemStack(Items.lava_bucket) });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.ROCKCUTTER_MV),
- RecipeLoader.BITSD,
- new Object[] { "DS ", "DP ", "DCB", 'D', GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1L),
- 'S', GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 1L), 'P',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1L), 'C', "circuitGood", 'B',
- ItemList.IC2_AdvBattery.get(1L) });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.ROCKCUTTER_LV),
- RecipeLoader.BITSD,
- new Object[] { "DS ", "DP ", "DCB", 'D', GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1L),
- 'S', GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 1L), 'P',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1L), 'C', "circuitBasic", 'B',
- ItemList.IC2_ReBattery.get(1L) });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.ROCKCUTTER_HV),
- RecipeLoader.BITSD,
- new Object[] { "DS ", "DP ", "DCB", 'D', GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1L),
- 'S', GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 1L), 'P',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L), 'C', "circuitAdvanced", 'B',
- ItemList.IC2_EnergyCrystal.get(1L) });
-
- if (ConfigHandler.teslastaff) {
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.TESLASTAFF),
- RecipeLoader.BITSD,
- new Object[] { "BO ", "OP ", " P", 'O',
- GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 1L), 'B',
- ItemList.Energy_LapotronicOrb.get(1L), 'P', "plateAlloyIridium", });
- }
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.PUMPPARTS, 1, 0), // tube
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { " fG", " G ", "G ", 'G', ItemList.Circuit_Parts_Glass_Tube.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.PUMPPARTS, 1, 1), // motor
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "GLP", "LSd", "PfT", 'G',
- GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 1L), 'L',
- GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 1L), 'S',
- GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 1L), 'P', new ItemStack(Blocks.piston),
- 'T', new ItemStack(ItemRegistry.PUMPPARTS, 1, 0) });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.PUMPBLOCK, 1, 0),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "IPI", "PMP", "ISI", 'I', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
- 'P', GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Wood, 1L), 'M',
- new ItemStack(ItemRegistry.PUMPPARTS, 1, 1), 'S', Ic2Items.ironFurnace });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.WINDMETER),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "SWF", "Sf ", "Ss ", 'S', "stickWood", 'W', new ItemStack(Blocks.wool, 1, Short.MAX_VALUE),
- 'F', new ItemStack(Items.string), });
-
- for (int i = 0; i < 3; i++) {
- Materials cable = cables[i + 2];
- ItemStack machinehull = ItemList.MACHINE_HULLS[i + 2].get(1L);
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.acidGens[i],
- RecipeLoader.BITSD,
- new Object[] { "HRH", "HCH", "HKH", 'H', bats[i], 'K',
- GT_OreDictUnificator.get(OrePrefixes.cableGt01, cable, 1L), 'C', machinehull, 'R', chreac[i] });
- }
-
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.acidGensLV,
- RecipeLoader.BITSD,
- new Object[] { "HRH", "KCK", "HKH", 'H', ItemList.Battery_Hull_LV.get(1L), 'K',
- GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 1L), 'C', ItemList.Hull_LV.get(1L), 'R',
- ItemList.Machine_LV_ChemicalReactor.get(1L), });
-
- for (int i = 0; i < 9; i++) {
- try {
- Materials cable = cables[i];
- ItemStack hull = hulls[i] instanceof Materials
- ? GT_OreDictUnificator.get(OrePrefixes.plate, hulls[i], 1L)
- : ((Werkstoff) hulls[i]).get(OrePrefixes.plate);
- ItemStack machinehull = ItemList.MACHINE_HULLS[i].get(1L);
-
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.energyDistributor[i],
- RecipeLoader.BITSD,
- new Object[] { "PWP", "WCW", "PWP", 'W', GT_OreDictUnificator.get(OrePrefixes.wireGt16, cable, 1L),
- 'P', hull, 'C', machinehull });
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.diode12A[i],
- RecipeLoader.BITSD,
- new Object[] { "WDW", "DCD", "PDP", 'D', OrePrefixes.componentCircuit.get(Materials.Diode), 'W',
- GT_OreDictUnificator.get(OrePrefixes.cableGt12, cable, 1L), 'P', hull, 'C', machinehull });
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.diode8A[i],
- RecipeLoader.BITSD,
- new Object[] { "WDW", "DCD", "PDP", 'D', OrePrefixes.componentCircuit.get(Materials.Diode), 'W',
- GT_OreDictUnificator.get(OrePrefixes.cableGt08, cable, 1L), 'P', hull, 'C', machinehull });
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.diode4A[i],
- RecipeLoader.BITSD,
- new Object[] { "WDW", "DCD", "PDP", 'D', OrePrefixes.componentCircuit.get(Materials.Diode), 'W',
- GT_OreDictUnificator.get(OrePrefixes.cableGt04, cable, 1L), 'P', hull, 'C', machinehull });
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.diode2A[i],
- RecipeLoader.BITSD,
- new Object[] { "WDW", "DCD", "PDP", 'D', OrePrefixes.componentCircuit.get(Materials.Diode), 'W',
- GT_OreDictUnificator.get(OrePrefixes.cableGt02, cable, 1L), 'P', hull, 'C', machinehull });
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.diode16A[i],
- RecipeLoader.BITSD,
- new Object[] { "WHW", "DCD", "PDP", 'H', OrePrefixes.componentCircuit.get(Materials.Inductor), 'D',
- OrePrefixes.componentCircuit.get(Materials.Diode), 'W',
- GT_OreDictUnificator.get(OrePrefixes.wireGt16, cable, 1L), 'P', hull, 'C', machinehull });
-
- } catch (ArrayIndexOutOfBoundsException ignored) {
-
- }
-
- }
-
- String[] stones = { "stone", "stoneSmooth" };
- String[] granites = { "blockGranite", "stoneGranite", "Granite", "granite" };
- for (String granite : granites) {
- for (String stone : stones) {
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 0),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "SSS", "DfD", " h ", 'S', stone, 'D',
- new ItemStack(GregTech_API.sBlockGranites, 1, OreDictionary.WILDCARD_VALUE), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 1),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "hDf", "SSS", 'S', stone, 'D',
- new ItemStack(GregTech_API.sBlockGranites, 1, OreDictionary.WILDCARD_VALUE), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 0),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "SSS", "DfD", " h ", 'S', stone, 'D', granite, });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 1),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "hDf", "SSS", 'S', stone, 'D', granite, });
- }
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 2),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "STS", "h f", "SBS", 'S', granite, 'T', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 0),
- 'B', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 1), });
- }
-
- GT_ModHandler.addCraftingRecipe(
- new GT_TileEntity_ManualTrafo(
- ConfigHandler.IDOffset + GT_Values.VN.length * 6 + 1,
- "bw.manualtrafo",
- StatCollector.translateToLocal("tile.manutrafo.name")).getStackForm(1L),
- RecipeLoader.BITSD,
- new Object[] { "SCS", "CHC", "ZCZ", 'S',
- GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1L), 'C',
- new ItemStack(ItemRegistry.BW_BLOCKS[2]), 'H', ItemList.Hull_HV.get(1L), 'Z', "circuitAdvanced" });
-
- GT_ModHandler.addCraftingRecipe(
- new GT_TileEntity_Windmill(
- ConfigHandler.IDOffset + GT_Values.VN.length * 6 + 2,
- "bw.windmill",
- StatCollector.translateToLocal("tile.bw.windmill.name")).getStackForm(1L),
- RecipeLoader.BITSD,
- new Object[] { "BHB", "WGW", "BWB", 'B', new ItemStack(Blocks.brick_block), 'W',
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Iron, 1L), 'H', new ItemStack(Blocks.hopper),
- 'G', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 2), });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 2),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "STS", "h f", "SBS", 'S',
- new ItemStack(GregTech_API.sBlockGranites, 1, OreDictionary.WILDCARD_VALUE), 'T',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 0), 'B',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 1), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WLs", "WLh", "WLf", 'L', new ItemStack(Items.leather), 'W', "logWood", });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WLs", "WLh", "WLf", 'L', new ItemStack(Blocks.carpet), 'W', "logWood", });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WLs", "WLh", "WLf", 'L', new ItemStack(Items.paper), 'W', "logWood", });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 6),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WEs", "WZh", "WDf", 'E', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3), 'Z',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4), 'D', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5),
- 'W', "logWood", });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 6),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WEs", "WZh", "WDf", 'Z', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3), 'E',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4), 'D', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5),
- 'W', "logWood", });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 6),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WEs", "WZh", "WDf", 'D', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3), 'Z',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4), 'E', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5),
- 'W', "logWood", });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 6),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WEs", "WZh", "WDf", 'E', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3), 'D',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4), 'Z', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5),
- 'W', "logWood", });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 6),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "WEs", "WZh", "WDf", 'Z', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3), 'D',
- new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4), 'E', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5),
- 'W', "logWood", });
-
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.LEATHER_ROTOR),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "hPf", "PWP", "sPr", 'P', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 3), 'W',
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Iron, 1L), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.WOOL_ROTOR),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "hPf", "PWP", "sPr", 'P', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 4), 'W',
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Iron, 1L), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.PAPER_ROTOR),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "hPf", "PWP", "sPr", 'P', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 5), 'W',
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Iron, 1L), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.COMBINED_ROTOR),
- GT_ModHandler.RecipeBits.NOT_REMOVABLE,
- new Object[] { "hPf", "PWP", "sPr", 'P', new ItemStack(ItemRegistry.CRAFTING_PARTS, 1, 6), 'W',
- GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Iron, 1L), });
- GT_ModHandler.addCraftingRecipe(
- new ItemStack(ItemRegistry.ROTORBLOCK),
- RecipeLoader.BITSD,
- new Object[] { "WRW", "RGR", "WRW", 'R', GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 1L),
- 'W', "plankWood", 'G', GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Iron, 1L), });
-
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.THTR,
- RecipeLoader.BITSD,
- new Object[] { "BZB", "BRB", "BZB", 'B', new ItemStack(GregTech_API.sBlockCasings3, 1, 12), 'R',
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "blockGenerator", 1, 5), 'Z', "circuitUltimate" });
-
- GT_ModHandler.addCraftingRecipe(
- ItemRegistry.HTGR,
- RecipeLoader.BITSD,
- new Object[] { "BZB", "BRB", "BZB", 'B', new ItemStack(GregTech_API.sBlockCasings8, 1, 5), 'R',
- GT_ModHandler.getModItem(IndustrialCraft2.ID, "blockGenerator", 1, 5), 'Z', "circuitSuperconductor" });
-
- // DNAExtractionModule
- GT_ModHandler.addCraftingRecipe(
- BioItemList.mBioLabParts[0],
- RecipeLoader.BITSD,
- new Object[] { "TET", "CFC", "TST", 'T',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1L), 'E', ItemList.Emitter_EV.get(1L),
- 'C', GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Aluminium, 1L), 'S',
- ItemList.Sensor_EV.get(1L), 'F', ItemList.Field_Generator_EV.get(1L) });
-
- // PCRThermoclyclingModule
- GT_ModHandler.addCraftingRecipe(
- BioItemList.mBioLabParts[1],
- RecipeLoader.BITSD,
- new Object[] { "NEN", "CFC", "NSN", 'N',
- GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Nichrome, 1L), 'E',
- ItemList.Emitter_EV.get(1L), 'C',
- GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Aluminium, 1L), 'S',
- ItemList.Sensor_EV.get(1L), 'F', ItemList.Field_Generator_EV.get(1L) });
-
- // PlasmidSynthesisModule
- GT_ModHandler.addCraftingRecipe(
- BioItemList.mBioLabParts[2],
- RecipeLoader.BITSD,
- new Object[] { "SFE", "CPC", "NFN", 'N',
- GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Nichrome, 1L), 'C', "circuit" + Materials.Data,
- 'F', ItemList.Field_Generator_EV.get(1L), 'E', ItemList.Emitter_EV.get(1L), 'S',
- ItemList.Sensor_EV.get(1L), 'P',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1L), });
- // TransformationModule
- GT_ModHandler.addCraftingRecipe(
- BioItemList.mBioLabParts[3],
- RecipeLoader.BITSD,
- new Object[] { "SFE", "CPC", "NFN", 'N',
- GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 1L), 'C',
- "circuit" + Materials.Master, 'F', ItemList.Field_Generator_LuV.get(1L), 'E',
- ItemList.Emitter_LuV.get(1L), 'S', ItemList.Sensor_LuV.get(1L), 'P',
- WerkstoffLoader.LuVTierMaterial.get(OrePrefixes.plate, 1), });
-
- // ClonalCellularSynthesisModule
- GT_ModHandler.addCraftingRecipe(
- BioItemList.mBioLabParts[4],
- RecipeLoader.BITSD,
- new Object[] { "FEF", "CPC", "FSF", 'N',
- GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 1L), 'C',
- "circuit" + Materials.Master, 'F', ItemList.Field_Generator_LuV.get(1L), 'E',
- ItemList.Emitter_LuV.get(1L), 'S', ItemList.Sensor_LuV.get(1L), 'P',
- WerkstoffLoader.LuVTierMaterial.get(OrePrefixes.plate, 1), });
-
- GT_ModHandler.addCraftingRecipe(
- new GT_TileEntity_BioVat(
- ConfigHandler.IDOffset + GT_Values.VN.length * 7,
- "bw.biovat",
- StatCollector.translateToLocal("tile.biovat.name")).getStackForm(1L),
- RecipeLoader.BITSD,
- new Object[] { "GCG", "KHK", "GCG", 'G', new ItemStack(ItemRegistry.bw_glasses[0], 1, 1), 'C',
- "circuit" + Materials.Data, 'K', GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Silver, 1L),
- 'H', ItemList.MACHINE_HULLS[3].get(1L) });
-
- ItemStack[] Pistons2 = { ItemList.Electric_Piston_HV.get(1L), ItemList.Electric_Piston_EV.get(1L),
- ItemList.Electric_Piston_IV.get(1L), ItemList.Electric_Piston_LuV.get(1L),
- ItemList.Electric_Piston_ZPM.get(1L), ItemList.Electric_Piston_UV.get(1L) };
- ItemStack[] BioLab2 = new ItemStack[GT_Values.VN.length - 3];
- ItemStack[] RadioHatch2 = new ItemStack[GT_Values.VN.length - 3];
- Materials[] cables2 = { Materials.Gold, Materials.Aluminium, Materials.Tungsten, Materials.VanadiumGallium,
- Materials.Naquadah, Materials.NaquadahAlloy, Materials.SuperconductorUHV };
- Materials[] hulls2 = { Materials.StainlessSteel, Materials.Titanium, Materials.TungstenSteel, Materials.Chrome,
- Materials.Iridium, Materials.Osmium, Materials.Naquadah };
- Materials[] wireMat2 = { Materials.Kanthal, Materials.Nichrome, Materials.TungstenSteel, Materials.Naquadah,
- Materials.NaquadahAlloy, Materials.SuperconductorUHV };
- Materials[] circuits2 = { Materials.Advanced, Materials.Data, Materials.Elite, Materials.Master,
- Materials.Ultimate, Materials.SuperconductorUHV };
-
- for (int i = 3; i < GT_Values.VN.length - 1; i++) {
- // 12625
- BioLab2[i - 3] = new GT_MetaTileEntity_BioLab(
- ConfigHandler.IDOffset + GT_Values.VN.length * 6 + i,
- "bw.biolab" + GT_Values.VN[i],
- GT_Values.VN[i] + " " + StatCollector.translateToLocal("tile.biolab.name"),
- i).getStackForm(1L);
- RadioHatch2[i - 3] = new GT_MetaTileEntity_RadioHatch(
- ConfigHandler.IDOffset + GT_Values.VN.length * 7 - 2 + i,
- "bw.radiohatch" + GT_Values.VN[i],
- GT_Values.VN[i] + " " + StatCollector.translateToLocal("tile.radiohatch.name"),
- i).getStackForm(1L);
- try {
- ItemStack machinehull = ItemList.MACHINE_HULLS[i].get(1L);
- GT_ModHandler.addCraftingRecipe(
- BioLab2[i - 3],
- RecipeLoader.BITSD,
- new Object[] { "PFP", "WCW", "OGO", 'F',
- GT_OreDictUnificator.get(OrePrefixes.frameGt, hulls2[i - 3], 1L), 'W',
- GT_OreDictUnificator.get(OrePrefixes.wireGt01, wireMat2[i - 3], 1L), 'P',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Polytetrafluoroethylene, 1L), 'O',
- GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Polystyrene, 1L), 'G',
- "circuit" + circuits2[i - 3], 'C', machinehull });
- GT_ModHandler.addCraftingRecipe(
- RadioHatch2[i - 3],
- RecipeLoader.BITSD,
- new Object[] { "DPD", "DCD", "DKD", 'D',
- GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1L), 'C', machinehull, 'K',
- GT_OreDictUnificator.get(OrePrefixes.cableGt08, cables2[i - 3], 1L), 'P', Pistons2[i - 3] });
- } catch (ArrayIndexOutOfBoundsException ignored) {
-
- }
- }
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java
deleted file mode 100644
index 9502d4eff3..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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 Electrolyzer implements Runnable {
-
- // TODO: fix the chemical balance issues there are below
- @Override
- public void run() {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.Forsterit.get(OrePrefixes.dust, 7))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L))
- .fluidOutputs(Materials.Oxygen.getGas(2000L))
- .duration(10 * SECONDS)
- .eut(90)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.RedZircon.get(OrePrefixes.dust, 6))
- .itemOutputs(
- WerkstoffLoader.Zirconium.get(OrePrefixes.dust, 1),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L))
- .fluidOutputs(Materials.Oxygen.getGas(2000L))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(90)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.Fayalit.get(OrePrefixes.dust, 7))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L))
- .fluidOutputs(Materials.Oxygen.getGas(2000L))
- .duration(16 * SECONDS)
- .eut(90)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.Prasiolite.get(OrePrefixes.dust, 16))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 5L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L))
- .duration(29 * SECONDS)
- .eut(90)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.Hedenbergit.get(OrePrefixes.dust, 10))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 2L))
- .fluidOutputs(Materials.Oxygen.getGas(2000L))
- .duration(15 * SECONDS)
- .eut(90)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.FuchsitAL.get(OrePrefixes.dust, 21), ItemList.Cell_Empty.get(2))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 3L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
- .fluidOutputs(Materials.Oxygen.getGas(2000L))
- .duration(19 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.FuchsitCR.get(OrePrefixes.dust, 21), ItemList.Cell_Empty.get(2))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 3L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
- .fluidOutputs(Materials.Oxygen.getGas(2000L))
- .duration(23 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.VanadioOxyDravit.get(OrePrefixes.dust, 53), ItemList.Cell_Empty.get(3))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 3L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnalium, 6L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 6),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 3),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3))
- .fluidOutputs(Materials.Oxygen.getGas(19000L))
- .duration(35 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.ChromoAluminoPovondrait.get(OrePrefixes.dust, 53), ItemList.Cell_Empty.get(3))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 3L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnalium, 6L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 6),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 3),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3))
- .fluidOutputs(Materials.Oxygen.getGas(19000L))
- .duration(36 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.FluorBuergerit.get(OrePrefixes.dust, 50), ItemList.Cell_Empty.get(3))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 6L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 6),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 3),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fluorine, 3))
- .fluidOutputs(Materials.Oxygen.getGas(6000L))
- .duration(36 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(electrolyzerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.Olenit.get(OrePrefixes.dust, 51), ItemList.Cell_Empty.get(1))
- .itemOutputs(
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 6L),
- GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 3),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1))
- .fluidOutputs(Materials.Oxygen.getGas(1000L))
- .duration(39 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(electrolyzerRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java
deleted file mode 100644
index 9b304de837..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.enums.Mods.CropLoadCore;
-import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import java.util.List;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.TierEU;
-
-public class Extractor implements Runnable {
-
- @Override
- public void run() {
- List<ItemStack> oreCropVine = OreDictionary.getOres("cropVine", false);
- if (CropLoadCore.isModLoaded() && !oreCropVine.isEmpty()) {
- for (ItemStack stack : oreCropVine) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(BW_Util.setStackSize(stack, 12))
- .itemOutputs(BioItemList.getOther(1))
- .duration(25 * SECONDS)
- .eut((int) TierEU.RECIPE_HV)
- .addTo(extractorRecipes);
-
- }
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Circuit_Chip_Stemcell.get(1L))
- .itemOutputs(BioItemList.getOther(4))
- .duration(25 * SECONDS)
- .eut((int) TierEU.RECIPE_LuV)
- .addTo(extractorRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java
deleted file mode 100644
index 1df03d10f2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR;
-
-public class FakeRecipes implements Runnable {
-
- @Override
- public void run() {
- GT_TileEntity_HTGR.HTGRMaterials.register_fake_THR_Recipes();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java
deleted file mode 100644
index 3d27c55038..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.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 net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_Utility;
-
-public class FluidHeater implements Runnable {
-
- @Override
- public void run() {
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(10))
- .fluidInputs(new FluidStack(FluidLoader.fulvicAcid, 1000))
- .fluidOutputs(new FluidStack(FluidLoader.heatedfulvicAcid, 1000))
- .duration(4 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(fluidHeaterRecipes);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java
deleted file mode 100644
index 4991370f44..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.MaterialsUEVplus;
-import gregtech.api.enums.TierEU;
-
-public class FluidSolidifier implements Runnable {
-
- @Override
- public void run() {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(Blocks.lapis_block))
- .itemOutputs(new ItemStack(ItemRegistry.BW_BLOCKS[0], 1, 0))
- .fluidInputs(Materials.Iron.getMolten(1296L))
- .duration(5 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 1))
- .fluidInputs(Materials.Titanium.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 2))
- .fluidInputs(Materials.TungstenSteel.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_EV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 3))
- .fluidInputs(WerkstoffLoader.LuVTierMaterial.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_IV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 4))
- .fluidInputs(Materials.Iridium.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_LuV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 5))
- .fluidInputs(Materials.Osmium.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_ZPM)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 13))
- .fluidInputs(Materials.Neutronium.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 14))
- .fluidInputs(Materials.CosmicNeutronium.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UHV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 15))
- .fluidInputs(Materials.Infinity.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UEV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 0))
- .itemOutputs(new ItemStack(ItemRegistry.bw_glasses[1], 1, 0))
- .fluidInputs(MaterialsUEVplus.TranscendentMetal.getMolten(1152))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UIV)
- .addTo(fluidSolidifierRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java
deleted file mode 100644
index bdeb24af9e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR.HTGRMaterials.MATERIALS_PER_FUEL;
-import static com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR.HTGRMaterials.sHTGR_Fuel;
-import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_THTR;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TierEU;
-
-public class FormingPress implements Runnable {
-
- @Override
- public void run() {
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials), Materials.Graphite.getDust(64))
- .itemOutputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 1))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 1),
- Materials.Silicon.getDust(64))
- .itemOutputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 2))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 2),
- Materials.Graphite.getDust(64))
- .itemOutputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, 1, 3))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
-
- int i = 0;
- for (GT_TileEntity_HTGR.HTGRMaterials.Fuel_ fuel : sHTGR_Fuel) {
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i),
- Materials.Carbon.getDust(64))
- .itemOutputs(new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 1))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 1),
- Materials.Silicon.getDust(64))
- .itemOutputs(new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 2))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 2),
- Materials.Graphite.getDust(64))
- .itemOutputs(new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 3))
- .duration(2 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
- i += MATERIALS_PER_FUEL;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java
deleted file mode 100644
index 59c84d0f7c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_Utility;
-
-public class LaserEngraver implements Runnable {
-
- @Override
- public void run() {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(Items.emerald), GT_Utility.getIntegratedCircuit(17))
- .itemOutputs(BioItemList.getPlasmidCell(null))
- .duration(5 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(laserEngraverRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java
deleted file mode 100644
index d69b4278ef..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR.HTGRMaterials.MATERIALS_PER_FUEL;
-import static com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR.HTGRMaterials.sHTGR_Fuel;
-import static gregtech.api.enums.Mods.Gendustry;
-import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_HTGR;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_THTR;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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;
-
-public class Mixer implements Runnable {
-
- @Override
- public void run() {
- GT_Values.RA.stdBuilder()
- .itemInputs(
- WerkstoffLoader.Thorium232.get(OrePrefixes.dust, 10),
- Materials.Uranium235.getDust(1),
- GT_Utility.getIntegratedCircuit(2))
- .itemOutputs(new ItemStack(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials))
- .duration(20 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- int i = 0;
- for (GT_TileEntity_HTGR.HTGRMaterials.Fuel_ fuel : sHTGR_Fuel) {
- GT_Values.RA.stdBuilder()
- .itemInputs(fuel.mainItem, fuel.secondaryItem, GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i))
- .duration(20 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- i += MATERIALS_PER_FUEL;
- }
-
- if (Gendustry.isModLoaded()) {
- GT_Values.RA.stdBuilder()
- .itemInputs(
- GT_Utility.getIntegratedCircuit(17),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidInputs(FluidRegistry.getFluidStack("liquiddna", 1000))
- .fluidOutputs(new FluidStack(FluidLoader.BioLabFluidMaterials[0], 2000))
- .duration(25 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(mixerRecipes);
- }
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java
deleted file mode 100644
index 4dbcc45708..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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;
-
-public class Pulverizer implements Runnable {
-
- @Override
- public void run() {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 1))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.Titanium.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_EV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 2))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.TungstenSteel.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_IV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 3))
- .itemOutputs(
- Materials.BorosilicateGlass.getDust(9),
- WerkstoffLoader.LuVTierMaterial.get(OrePrefixes.dust, 8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_LuV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 4))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.Iridium.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_ZPM)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 5))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.Osmium.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 13))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.Neutronium.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UHV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 14))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.CosmicNeutronium.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UEV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, 15))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), Materials.Infinity.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UIV)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[1], 1, 0))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9), MaterialsUEVplus.TranscendentMetal.getDust(8))
- .duration(40 * SECONDS)
- .eut(TierEU.RECIPE_UMV)
- .addTo(maceratorRecipes);
-
- for (int i = 6; i < 11; i++) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(ItemRegistry.bw_glasses[0], 1, i))
- .itemOutputs(Materials.BorosilicateGlass.getDust(9))
- .duration(20 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(maceratorRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java
deleted file mode 100644
index c810c323d9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.loaders.recipes;
-
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TierEU;
-
-public class PyrolyseOven implements Runnable {
-
- @Override
- public void run() {
- GT_Values.RA.addPyrolyseRecipe(
- Materials.Wood.getDust(10),
- new FluidStack(FluidLoader.Kerogen, 1000),
- 10,
- null,
- Materials.Oil.getFluid(1000),
- 105,
- (int) TierEU.RECIPE_HV);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java
deleted file mode 100644
index b5e002ef29..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import java.util.EnumMap;
-import java.util.List;
-
-import javax.annotation.Nonnull;
-
-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 cpw.mods.fml.server.FMLServerHandler;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.net.GT_Packet;
-import gregtech.api.net.GT_Packet_New;
-import gregtech.api.net.IGT_NetworkHandler;
-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;
-
-/*
- * Original GT File slightly Modified
- */
-@SuppressWarnings("deprecation")
-@ChannelHandler.Sharable
-public class BW_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet_New> implements IGT_NetworkHandler {
-
- private final EnumMap<Side, FMLEmbeddedChannel> mChannel;
- private final GT_Packet_New[] mSubChannels;
-
- public BW_Network() {
- this.mChannel = NetworkRegistry.INSTANCE.newChannel("BartWorks", this, new BW_Network.HandlerShared());
- this.mSubChannels = new GT_Packet_New[] { new RendererPacket(), new CircuitProgrammerPacket(),
- new MetaBlockPacket(), new OreDictCachePacket(), new ServerJoinedPackage(), new EICPacket() };
- }
-
- @Override
- protected void encode(ChannelHandlerContext aContext, GT_Packet_New aPacket, List<Object> aOutput)
- throws Exception {
- aOutput.add(
- new FMLProxyPacket(
- Unpooled.buffer()
- .writeByte(aPacket.getPacketID())
- .writeBytes(aPacket.encode())
- .copy(),
- aContext.channel()
- .attr(NetworkRegistry.FML_CHANNEL)
- .get()));
- }
-
- @Override
- protected void decode(ChannelHandlerContext aContext, FMLProxyPacket aPacket, List<Object> aOutput)
- throws Exception {
- ByteArrayDataInput aData = ByteStreams.newDataInput(
- aPacket.payload()
- .array());
- aOutput.add(this.mSubChannels[aData.readByte()].decode(aData));
- }
-
- @Override
- public void sendToPlayer(@Nonnull GT_Packet aPacket, @Nonnull EntityPlayerMP aPlayer) {
- 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);
- }
-
- public void sendToAllPlayersinWorld(@Nonnull GT_Packet aPacket, World world) {
- for (String name : FMLServerHandler.instance()
- .getServer()
- .getAllUsernames()) {
- this.mChannel.get(Side.SERVER)
- .attr(FMLOutboundHandler.FML_MESSAGETARGET)
- .set(FMLOutboundHandler.OutboundTarget.PLAYER);
- this.mChannel.get(Side.SERVER)
- .attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
- .set(world.getPlayerEntityByName(name));
- this.mChannel.get(Side.SERVER)
- .writeAndFlush(aPacket);
- }
- }
-
- @Override
- public void sendToAllAround(@Nonnull 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(@Nonnull 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, @Nonnull 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)) {
- this.sendToPlayer(aPacket, tPlayer);
- }
- }
- }
- }
-
- @Sharable
- static final class HandlerShared extends SimpleChannelInboundHandler<GT_Packet_New> {
-
- HandlerShared() {}
-
- @Override
- protected void channelRead0(ChannelHandlerContext ctx, GT_Packet_New aPacket) throws Exception {
- EntityPlayer aPlayer = GT_Values.GT.getThePlayer();
- aPacket.process(aPlayer == null ? null : GT_Values.GT.getThePlayer().worldObj);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java
deleted file mode 100644
index c47b834157..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-import net.minecraftforge.common.DimensionManager;
-
-import com.github.bartimaeusnek.bartworks.common.items.Circuit_Programmer;
-import com.google.common.io.ByteArrayDataInput;
-
-import gregtech.api.net.GT_Packet_New;
-import io.netty.buffer.ByteBuf;
-
-public class CircuitProgrammerPacket extends GT_Packet_New {
-
- private int dimID, playerID;
- private byte chipCfg;
- private boolean hasChip;
-
- public CircuitProgrammerPacket() {
- super(true);
- }
-
- public CircuitProgrammerPacket(int dimID, int playerID, boolean hasChip, byte chipCfg) {
- super(false);
- this.dimID = dimID;
- this.playerID = playerID;
- this.hasChip = hasChip;
- this.chipCfg = chipCfg;
- }
-
- @Override
- public byte getPacketID() {
- return 1;
- }
-
- @Override
- public void encode(ByteBuf aOut) {
- aOut.writeInt(this.dimID)
- .writeInt(this.playerID)
- .writeByte(this.hasChip ? this.chipCfg : -1);
- }
-
- @Override
- public GT_Packet_New decode(ByteArrayDataInput byteArrayDataInput) {
- return new CircuitProgrammerPacket(
- byteArrayDataInput.readInt(),
- byteArrayDataInput.readInt(),
- byteArrayDataInput.readByte() > -1,
- byteArrayDataInput.readByte());
- }
-
- @Override
- public void process(IBlockAccess iBlockAccess) {
- World w = DimensionManager.getWorld(this.dimID);
- if (w != null && w.getEntityByID(this.playerID) instanceof EntityPlayer) {
- ItemStack stack = ((EntityPlayer) w.getEntityByID(this.playerID)).getHeldItem();
- if (stack != null && stack.stackSize > 0) {
- Item item = stack.getItem();
- if (item instanceof Circuit_Programmer) {
- NBTTagCompound nbt = stack.getTagCompound();
- nbt.setBoolean("HasChip", this.hasChip);
- if (this.hasChip) nbt.setByte("ChipConfig", this.chipCfg);
- stack.setTagCompound(nbt);
- ((EntityPlayer) w.getEntityByID(this.playerID)).inventory.setInventorySlotContents(
- ((EntityPlayer) w.getEntityByID(this.playerID)).inventory.currentItem,
- stack);
- }
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java
deleted file mode 100644
index 621cc3fe4f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.world.IBlockAccess;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_ElectricImplosionCompressor;
-import com.github.bartimaeusnek.bartworks.util.Coords;
-import com.google.common.io.ByteArrayDataInput;
-
-import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.net.GT_Packet_New;
-import io.netty.buffer.ByteBuf;
-
-public class EICPacket extends GT_Packet_New {
-
- private Coords coords;
- private boolean bool;
-
- public EICPacket() {
- super(true);
- }
-
- public EICPacket(Coords coords, boolean bool) {
- super(false);
- this.coords = coords;
- this.bool = bool;
- }
-
- @Override
- public byte getPacketID() {
- return 5;
- }
-
- @Override
- public void encode(ByteBuf aOut) {
- aOut.writeInt(this.coords.x);
- aOut.writeInt(this.coords.y);
- aOut.writeInt(this.coords.z);
- aOut.writeBoolean(this.bool);
- }
-
- @Override
- public GT_Packet_New decode(ByteArrayDataInput aData) {
- return new EICPacket(new Coords(aData.readInt(), aData.readInt(), aData.readInt()), aData.readBoolean());
- }
-
- @Override
- public void process(IBlockAccess aWorld) {
- if (SideReference.Side.Client) {
- TileEntity te = aWorld.getTileEntity(this.coords.x, this.coords.y, this.coords.z);
- if (!(te instanceof IGregTechTileEntity)) return;
- IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity();
- if (!(mte instanceof GT_TileEntity_ElectricImplosionCompressor)) return;
- if (this.bool && !((IGregTechTileEntity) te).hasMufflerUpgrade())
- ((IGregTechTileEntity) te).addMufflerUpgrade();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java
deleted file mode 100644
index 6b555014ed..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import java.nio.ByteBuffer;
-
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Block_TE;
-import com.github.bartimaeusnek.bartworks.util.MurmurHash3;
-import com.google.common.io.ByteArrayDataInput;
-
-import gregtech.api.net.GT_Packet_New;
-import io.netty.buffer.ByteBuf;
-
-public class MetaBlockPacket extends GT_Packet_New {
-
- int x;
- short y;
- int z;
- short meta;
-
- public MetaBlockPacket(int x, int y, int z, int meta) {
- super(false);
- this.x = x;
- this.y = (short) y;
- this.z = z;
- this.meta = (short) meta;
- }
-
- public MetaBlockPacket() {
- super(true);
- }
-
- @Override
- public byte getPacketID() {
- return 2;
- }
-
- @Override
- public void encode(ByteBuf aOut) {
- int hash = MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(12)
- .putInt(this.x)
- .putInt(this.z)
- .putShort(this.y)
- .putShort(this.meta)
- .array(),
- 0,
- 12,
- 31);
- aOut.writeInt(this.x)
- .writeInt(this.z)
- .writeShort(this.y)
- .writeShort(this.meta)
- .writeInt(hash);
- }
-
- @Override
- public GT_Packet_New decode(ByteArrayDataInput byteArrayDataInput) {
- this.x = byteArrayDataInput.readInt();
- this.z = byteArrayDataInput.readInt();
- this.y = byteArrayDataInput.readShort();
- this.meta = byteArrayDataInput.readShort();
- MetaBlockPacket todecode = new MetaBlockPacket(this.x, this.y, this.z, this.meta);
- if (byteArrayDataInput.readInt() != MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(12)
- .putInt(this.x)
- .putInt(this.z)
- .putShort(this.y)
- .putShort(this.meta)
- .array(),
- 0,
- 12,
- 31)) {
- MainMod.LOGGER.error("PACKET HASH DOES NOT MATCH!");
- return null;
- }
- return todecode;
- }
-
- @Override
- public void process(IBlockAccess iBlockAccess) {
- if (iBlockAccess != null) {
- TileEntity tTileEntity = iBlockAccess.getTileEntity(this.x, this.y, this.z);
- if (tTileEntity instanceof BW_MetaGenerated_Block_TE) {
- ((BW_MetaGenerated_Block_TE) tTileEntity).mMetaData = this.meta;
- }
- if (iBlockAccess instanceof World && ((World) iBlockAccess).isRemote) {
- ((World) iBlockAccess).markBlockForUpdate(this.x, this.y, this.z);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java
deleted file mode 100644
index c488273d73..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import java.util.HashSet;
-
-import net.minecraft.world.IBlockAccess;
-
-import com.github.bartimaeusnek.bartworks.system.oredict.OreDictHandler;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.google.common.io.ByteArrayDataInput;
-
-import gregtech.api.net.GT_Packet_New;
-import io.netty.buffer.ByteBuf;
-
-public class OreDictCachePacket extends GT_Packet_New {
-
- private HashSet<Pair<Integer, Short>> hashSet = new HashSet<>();
-
- public OreDictCachePacket() {
- super(true);
- }
-
- public OreDictCachePacket(HashSet<Pair<Integer, Short>> set) {
- super(false);
- this.hashSet = set;
- }
-
- @Override
- public byte getPacketID() {
- return 3;
- }
-
- @Override
- public void encode(ByteBuf aOut) {
- int size = this.hashSet.size();
- aOut.writeInt(size);
- for (Pair<Integer, Short> p : this.hashSet) {
- aOut.writeInt(p.getKey())
- .writeShort(p.getValue());
- }
- }
-
- @Override
- public GT_Packet_New decode(ByteArrayDataInput byteArrayDataInput) {
- int size = byteArrayDataInput.readInt();
- for (int i = 0; i < size; i++) {
- this.hashSet.add(new Pair<>(byteArrayDataInput.readInt(), byteArrayDataInput.readShort()));
- }
- return new OreDictCachePacket(this.hashSet);
- }
-
- @Override
- public void process(IBlockAccess iBlockAccess) {
- OreDictHandler.getNonBWCache()
- .clear();
- OreDictHandler.getNonBWCache()
- .addAll(this.hashSet);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java
deleted file mode 100644
index 436413fa14..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import net.minecraft.world.IBlockAccess;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.tileentities.multis.GT_TileEntity_BioVat;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.Coords;
-import com.google.common.io.ByteArrayDataInput;
-
-import gregtech.api.net.GT_Packet_New;
-import io.netty.buffer.ByteBuf;
-
-public class RendererPacket extends GT_Packet_New {
-
- private Coords coords;
- private int integer;
- private byte removal;
-
- public RendererPacket() {
- super(true);
- }
-
- public RendererPacket(Coords coords, int integer, boolean removal) {
- super(false);
- this.coords = coords;
- this.integer = integer;
- this.removal = (byte) (removal ? 1 : 0);
- }
-
- @Override
- public byte getPacketID() {
- return 0;
- }
-
- @Override
- public void encode(ByteBuf aOut) {
- byte r = (byte) (this.integer >> 16 & 0xFF);
- byte g = (byte) (this.integer >> 8 & 0xFF);
- byte b = (byte) (this.integer & 0xFF);
- byte checksum = (byte) (this.coords.x % 25 + this.coords.y % 25
- + this.coords.z % 25
- + this.coords.wID % 25
- + this.integer % 25
- + this.removal);
- aOut.writeInt(this.coords.x)
- .writeShort(this.coords.y)
- .writeInt(this.coords.z)
- .writeInt(this.coords.wID)
- .writeByte(r)
- .writeByte(g)
- .writeByte(b)
- .writeByte(this.removal)
- .writeByte(checksum);
- }
-
- @Override
- public GT_Packet_New decode(ByteArrayDataInput dataInput) {
- this.coords = new Coords(dataInput.readInt(), dataInput.readShort(), dataInput.readInt(), dataInput.readInt());
- this.integer = BW_ColorUtil
- .getColorFromRGBArray(new int[] { dataInput.readByte(), dataInput.readByte(), dataInput.readByte() });
- this.removal = dataInput.readByte();
-
- byte checksum = (byte) (this.coords.x % 25 + this.coords.y % 25
- + this.coords.z % 25
- + this.coords.wID % 25
- + this.integer % 25
- + this.removal);
-
- if (checksum != dataInput.readByte()) {
- MainMod.LOGGER.error("BW Packet was corrupted or modified!");
- return null;
- }
-
- return new RendererPacket(this.coords, this.integer, this.removal == 1);
- }
-
- @Override
- public void process(IBlockAccess iBlockAccess) {
- if (SideReference.Side.Client) {
- if (this.removal == 0) GT_TileEntity_BioVat.staticColorMap.put(this.coords, this.integer);
- else GT_TileEntity_BioVat.staticColorMap.remove(this.coords);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java
deleted file mode 100644
index 091802683d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.net;
-
-import net.minecraft.world.IBlockAccess;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.google.common.io.ByteArrayDataInput;
-
-import gregtech.api.net.GT_Packet_New;
-import io.netty.buffer.ByteBuf;
-
-public class ServerJoinedPackage extends GT_Packet_New {
-
- private byte config;
-
- ServerJoinedPackage() {
- super(true);
- }
-
- public ServerJoinedPackage(Object obj) {
- super(false);
- this.config = (byte) (ConfigHandler.classicMode && ConfigHandler.disableExtraGassesForEBF ? 3
- : ConfigHandler.classicMode ? 2 : ConfigHandler.disableExtraGassesForEBF ? 1 : 0);
- }
-
- @Override
- public byte getPacketID() {
- return 4;
- }
-
- @Override
- public void encode(ByteBuf aOut) {
- aOut.writeByte(this.config);
- }
-
- @Override
- public GT_Packet_New decode(ByteArrayDataInput byteArrayDataInput) {
- this.config = byteArrayDataInput.readByte();
- return this;
- }
-
- @Override
- public void process(IBlockAccess iBlockAccess) {
- boolean gas = (this.config & 1) != 0;
- boolean classic = (this.config & 0b10) != 0;
- MainMod.runOnPlayerJoined(classic, gas);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java
deleted file mode 100644
index bb0c0cf319..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.classic;
-
-import net.minecraft.tileentity.TileEntity;
-
-public class BWTileEntityDimIDBridge extends TileEntity {
-
- @Override
- public boolean canUpdate() {
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java
deleted file mode 100644
index 5db8989d0c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.classic;
-
-import net.minecraft.client.gui.GuiScreen;
-import net.minecraft.entity.player.EntityPlayer;
-
-import com.github.bartimaeusnek.bartworks.client.gui.BW_GUIContainer_RotorBlock;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import ic2.core.block.kineticgenerator.container.ContainerWindKineticGenerator;
-import ic2.core.block.kineticgenerator.tileentity.TileEntityWindKineticGenerator;
-
-public class BW_RotorBlock extends TileEntityWindKineticGenerator {
-
- public int getGrindPower() {
- return super.getKuOutput();
- }
-
- @Override
- public int getKuOutput() {
- return 0;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public GuiScreen getGui(EntityPlayer entityPlayer, boolean isAdmin) {
- return new BW_GUIContainer_RotorBlock(new ContainerWindKineticGenerator(entityPlayer, this));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java
deleted file mode 100644
index 79bedfa1b8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.classic;
-
-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.WEST;
-
-import java.util.Comparator;
-import java.util.PriorityQueue;
-
-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.TileFluidHandler;
-
-import com.github.bartimaeusnek.bartworks.API.ITileAddsInformation;
-import com.github.bartimaeusnek.bartworks.util.Coords;
-
-public class BW_TileEntity_ExperimentalFloodGate extends TileFluidHandler implements ITileAddsInformation {
-
- private static final ForgeDirection[] allowed_directions = { DOWN, WEST, EAST, SOUTH, NORTH };
- private PriorityQueue<Coords> breadthFirstQueue = new PriorityQueue<>(Comparator.comparingInt(x -> x.y));
- private boolean wasInited = false;
-
- public BW_TileEntity_ExperimentalFloodGate() {
- this.tank.setCapacity(64000);
- }
-
- @Override
- public boolean canFill(ForgeDirection from, Fluid fluid) {
- return fluid.canBePlacedInWorld();
- }
-
- public void initEntity() {
- if (this.wasInited) return;
- this.breadthFirstQueue.add(new Coords(this.xCoord, this.yCoord, this.zCoord));
- this.wasInited = true;
- }
-
- @Override
- public void updateEntity() {
- this.initEntity();
- Coords current = this.breadthFirstQueue.poll();
- if (current == null) return;
- this.setFluidBlock(current);
- for (ForgeDirection allowed_direction : allowed_directions) {
- this.addBlockToQueue(current, allowed_direction);
- }
- }
-
- @Override
- public void writeToNBT(NBTTagCompound tag) {
- super.writeToNBT(tag);
- tag.setBoolean("init", this.wasInited);
-
- int[] x = new int[this.breadthFirstQueue.size()];
- int[] y = new int[this.breadthFirstQueue.size()];
- int[] z = new int[this.breadthFirstQueue.size()];
- Coords[] arr = this.breadthFirstQueue.toArray(new Coords[0]);
-
- for (int i = 0; i < this.breadthFirstQueue.size(); i++) {
- x[i] = arr[i].x;
- y[i] = arr[i].y;
- z[i] = arr[i].z;
- }
-
- tag.setIntArray("queueX", x);
- tag.setIntArray("queueY", y);
- tag.setIntArray("queueZ", z);
- }
-
- @Override
- public void readFromNBT(NBTTagCompound tag) {
- super.readFromNBT(tag);
- this.wasInited = tag.getBoolean("init");
- int[] x = tag.getIntArray("queueX");
- int[] y = tag.getIntArray("queueY");
- int[] z = tag.getIntArray("queueZ");
- for (int i = 0; i < x.length; i++) {
- this.breadthFirstQueue.add(new Coords(x[i], y[i], z[i]));
- }
- }
-
- private void setFluidBlock(Coords current) {
- if (!this.checkForAir(current) || this.tank.drain(1000, false) == null
- || this.tank.drain(1000, false).amount != 1000) return;
- FluidStack stack = this.tank.drain(1000, true);
- this.worldObj.setBlock(
- current.x,
- current.y,
- current.z,
- stack.getFluid()
- .getBlock(),
- 0,
- 2);
- }
-
- private void addBlockToQueue(Coords current, ForgeDirection allowed_direction) {
- Coords side = current.getCoordsFromSide(allowed_direction);
- if (this.checkForAir(side)) this.breadthFirstQueue.add(side);
- }
-
- private boolean checkForAir(Coords coords) {
- return this.worldObj.isAirBlock(coords.x, coords.y, coords.z);
- }
-
- @Override
- public String[] getInfoData() {
- return new String[] { "Experimental Machine to fill Holes with Fluids" };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java
deleted file mode 100644
index faccfc4738..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.classic;
-
-import java.util.Arrays;
-import java.util.Optional;
-
-import net.minecraft.client.renderer.texture.IIconRegister;
-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.tileentity.TileEntityFurnace;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidEvent;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.FluidTankInfo;
-import net.minecraftforge.fluids.IFluidHandler;
-import net.minecraftforge.fluids.IFluidTank;
-
-import com.github.bartimaeusnek.bartworks.API.ITileAddsInformation;
-import com.github.bartimaeusnek.bartworks.API.ITileDropsContent;
-import com.github.bartimaeusnek.bartworks.API.ITileHasDifferentTextureSides;
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.gtnewhorizons.modularui.api.ModularUITextures;
-import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
-import com.gtnewhorizons.modularui.api.forge.InvWrapper;
-import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
-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 gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Pollution;
-
-public class BW_TileEntity_HeatedWaterPump extends TileEntity implements ITileDropsContent, IFluidHandler, IFluidTank,
- ITileWithModularUI, ITileAddsInformation, ITileHasDifferentTextureSides {
-
- public static final int FUELSLOT = 0;
- public static final Fluid WATER = FluidRegistry.WATER;
- public ItemStack fuelstack;
- public FluidStack outputstack = new FluidStack(FluidRegistry.WATER, 0);
- public int fuel;
- public byte tick;
- public int maxfuel;
- public ItemStack fakestack = new ItemStack(Blocks.water);
-
- @Override
- public void writeToNBT(NBTTagCompound compound) {
- NBTTagCompound subItemStack = new NBTTagCompound();
- if (this.fuelstack != null) {
- this.fuelstack.writeToNBT(subItemStack);
- }
- compound.setTag("ItemStack", subItemStack);
- NBTTagCompound subFluidStack = new NBTTagCompound();
- this.outputstack.writeToNBT(subFluidStack);
- compound.setTag("FluidStack", subFluidStack);
- compound.setInteger("fuel", this.fuel);
- compound.setInteger("maxfuel", this.maxfuel);
- compound.setByte("tick", this.tick);
- super.writeToNBT(compound);
- }
-
- @Override
- public void readFromNBT(NBTTagCompound compound) {
- this.tick = compound.getByte("tick");
- this.fuel = compound.getInteger("fuel");
- this.maxfuel = compound.getInteger("maxfuel");
- this.outputstack = FluidStack.loadFluidStackFromNBT(compound.getCompoundTag("FluidStack"));
- if (!compound.getCompoundTag("ItemStack")
- .equals(new NBTTagCompound()))
- this.fuelstack = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("ItemStack"));
- super.readFromNBT(compound);
- }
-
- private boolean checkPreUpdate() {
- return (this.fuelstack == null || this.fuelstack.stackSize <= 0) && this.fuel <= 0;
- }
-
- private void fixUnderlflow() {
- if (this.fuel < 0) this.fuel = 0;
- }
-
- private void handleRefuel() {
- if (this.fuelstack != null && this.fuel == 0) {
- this.fuel = this.maxfuel = TileEntityFurnace.getItemBurnTime(this.fuelstack);
- --this.fuelstack.stackSize;
- if (this.fuelstack.stackSize <= 0) this.fuelstack = null;
- }
- }
-
- private void handleWaterGeneration() {
- if (this.fuel > 0) {
- ++this.tick;
- --this.fuel;
- if (this.tick % 20 == 0) {
- if (this.outputstack.amount <= 8000 - ConfigHandler.mbWaterperSec)
- this.outputstack.amount += ConfigHandler.mbWaterperSec;
- this.tick = 0;
- }
- }
- }
-
- @Override
- public void updateEntity() {
- if (this.worldObj.isRemote) return;
-
- this.pushWaterToAdjacentTiles();
- this.fakestack.setStackDisplayName(this.outputstack.amount + "L Water");
- if (this.checkPreUpdate()) return;
-
- this.fixUnderlflow();
- this.handleRefuel();
- this.handleWaterGeneration();
- this.causePollution();
- }
-
- private void pushWaterToAdjacentTiles() {
- Arrays.stream(ForgeDirection.values(), 0, 6) // All but Unknown
- .forEach(
- direction -> Optional
- .ofNullable(
- this.worldObj.getTileEntity(
- this.xCoord + direction.offsetX,
- this.yCoord + direction.offsetY,
- this.zCoord + direction.offsetZ))
- .ifPresent(te -> {
- if (te instanceof IFluidHandler tank) {
- if (tank.canFill(direction.getOpposite(), this.outputstack.getFluid())) {
- int drainage = tank.fill(direction.getOpposite(), this.outputstack, false);
- if (drainage > 0) {
- tank.fill(direction.getOpposite(), this.outputstack, true);
- this.drain(drainage, true);
- }
- }
- } else if (te instanceof IFluidTank tank) {
- int drainage = tank.fill(this.outputstack, false);
- if (drainage > 0) {
- tank.fill(this.outputstack, true);
- this.drain(drainage, true);
- }
- }
- }));
- }
-
- private void causePollution() {
- Optional.ofNullable(this.worldObj)
- .ifPresent(e -> {
- if (e.getTotalWorldTime() % 20 == 0) {
- Optional.ofNullable(e.getChunkFromBlockCoords(this.xCoord, this.zCoord))
- .ifPresent(c -> GT_Pollution.addPollution(c, ConfigHandler.pollutionHeatedWaterPumpSecond));
- }
- });
- }
-
- @Override
- public int[] getAccessibleSlotsFromSide(int side) {
- return new int[] { 0 };
- }
-
- @Override
- public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) {
- return TileEntityFurnace.getItemBurnTime(p_102007_2_) > 0;
- }
-
- @Override
- public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) {
- return false;
- }
-
- @Override
- public int getSizeInventory() {
- return 2;
- }
-
- @Override
- public ItemStack getStackInSlot(int slotIn) {
- if (slotIn == 0) return this.fuelstack;
- return this.fakestack;
- }
-
- @Override
- public ItemStack decrStackSize(int slot, int ammount) {
- if (slot != BW_TileEntity_HeatedWaterPump.FUELSLOT || this.fuelstack == null
- || ammount > this.fuelstack.stackSize) return null;
-
- return this.fuelstack.splitStack(ammount);
- }
-
- @Override
- public ItemStack getStackInSlotOnClosing(int index) {
- return null;
- }
-
- @Override
- public void setInventorySlotContents(int slot, ItemStack stack) {
- if (slot == BW_TileEntity_HeatedWaterPump.FUELSLOT) this.fuelstack = stack;
- else this.fakestack = stack;
- }
-
- @Override
- public String getInventoryName() {
- return null;
- }
-
- @Override
- public boolean hasCustomInventoryName() {
- return false;
- }
-
- @Override
- public int getInventoryStackLimit() {
- return 64;
- }
-
- @Override
- public boolean isUseableByPlayer(EntityPlayer player) {
- return true;
- }
-
- @Override
- public void openInventory() {}
-
- @Override
- public void closeInventory() {}
-
- @Override
- public boolean isItemValidForSlot(int index, ItemStack stack) {
- return TileEntityFurnace.getItemBurnTime(stack) > 0 && index == BW_TileEntity_HeatedWaterPump.FUELSLOT;
- }
-
- @Override
- public FluidStack getFluid() {
- return this.outputstack.amount > 0 ? this.outputstack : null;
- }
-
- @Override
- public int getFluidAmount() {
- return this.outputstack.amount;
- }
-
- @Override
- public int getCapacity() {
- return 8000;
- }
-
- @Override
- public FluidTankInfo getInfo() {
- return new FluidTankInfo(this);
- }
-
- @Override
- public int fill(FluidStack resource, boolean doFill) {
- return 0;
- }
-
- @Override
- public FluidStack drain(int maxDrain, boolean doDrain) {
- int actualdrain = maxDrain;
- if (actualdrain > this.outputstack.amount) actualdrain = this.outputstack.amount;
- FluidStack ret = new FluidStack(BW_TileEntity_HeatedWaterPump.WATER, actualdrain);
- if (ret.amount == 0) ret = null;
- if (doDrain) {
- this.outputstack.amount -= actualdrain;
- FluidEvent.fireEvent(
- new FluidEvent.FluidDrainingEvent(
- this.outputstack,
- this.getWorldObj(),
- this.xCoord,
- this.yCoord,
- this.zCoord,
- this,
- actualdrain));
- }
- return ret;
- }
-
- @Override
- public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
- return 0;
- }
-
- @Override
- public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
- if (resource != null && resource.getFluid() == BW_TileEntity_HeatedWaterPump.WATER
- && this.drain(resource.amount, false) != null) return this.drain(resource.amount, doDrain);
- return null;
- }
-
- @Override
- public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
- return this.drain(maxDrain, doDrain);
- }
-
- @Override
- public boolean canFill(ForgeDirection from, Fluid fluid) {
- return false;
- }
-
- @Override
- public boolean canDrain(ForgeDirection from, Fluid fluid) {
- return fluid == null || fluid == BW_TileEntity_HeatedWaterPump.WATER;
- }
-
- @Override
- public FluidTankInfo[] getTankInfo(ForgeDirection from) {
- return new FluidTankInfo[] { this.getInfo() };
- }
-
- @Override
- public String[] getInfoData() {
- return new String[] {
- StatCollector.translateToLocal("tooltip.tile.waterpump.0.name") + " "
- + GT_Utility.formatNumbers(ConfigHandler.mbWaterperSec)
- + String.format(
- StatCollector.translateToLocal("tooltip.tile.waterpump.1.name"),
- ConfigHandler.pollutionHeatedWaterPumpSecond),
- StatCollector.translateToLocal("tooltip.tile.waterpump.2.name") };
- }
-
- @Override
- public void registerBlockIcons(IIconRegister par1IconRegister) {
- ITileHasDifferentTextureSides.texture[ForgeDirection.UP.ordinal()] = par1IconRegister
- .registerIcon(MainMod.MOD_ID + ":heatedWaterPumpTop");
- ITileHasDifferentTextureSides.texture[ForgeDirection.DOWN.ordinal()] = par1IconRegister
- .registerIcon(MainMod.MOD_ID + ":heatedWaterPumpDown");
- for (int i = 2; i < 7; i++) {
- ITileHasDifferentTextureSides.texture[i] = par1IconRegister
- .registerIcon(MainMod.MOD_ID + ":heatedWaterPumpSide");
- }
- }
-
- @Override
- public ModularWindow createWindow(UIBuildContext buildContext) {
- ModularWindow.Builder builder = ModularWindow.builder(176, 166);
- builder.setBackground(ModularUITextures.VANILLA_BACKGROUND);
- builder.bindPlayerInventory(buildContext.getPlayer());
- final IItemHandlerModifiable invWrapper = new InvWrapper(this);
-
- builder.widget(
- new SlotWidget(invWrapper, 0).setFilter(stack -> TileEntityFurnace.getItemBurnTime(stack) > 0)
- .setPos(55, 52))
- .widget(
- SlotWidget.phantom(invWrapper, 1)
- .disableInteraction()
- .setPos(85, 32))
- .widget(
- new ProgressBar().setProgress(() -> (float) this.fuel / this.maxfuel)
- .setTexture(BW_UITextures.PROGRESSBAR_FUEL, 14)
- .setDirection(ProgressBar.Direction.UP)
- .setPos(56, 36)
- .setSize(14, 14));
-
- return builder.build();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java
deleted file mode 100644
index 0dc888c663..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.classic;
-
-import java.util.ArrayList;
-
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-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.FluidTankInfo;
-import net.minecraftforge.fluids.IFluidHandler;
-import net.minecraftforge.fluids.IFluidTank;
-
-import gregtech.api.util.GT_Utility;
-
-public class BW_TileEntity_InfinityTank extends TileEntity implements IFluidTank, IFluidHandler {
-
- final ArrayList<FluidStack> INTERNALTANKS = new ArrayList<>();
-
- int selectedTank;
-
- @Override
- public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
- return this.fill(resource, doFill);
- }
-
- @Override
- public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
- return this.drain(from, resource != null ? resource.amount : 0, doDrain);
- }
-
- @Override
- public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
- return this.drain(maxDrain, doDrain);
- }
-
- @Override
- public boolean canFill(ForgeDirection from, Fluid fluid) {
- return true;
- }
-
- @Override
- public boolean canDrain(ForgeDirection from, Fluid fluid) {
- boolean ret = false;
- for (FluidStack stack : this.INTERNALTANKS) {
- ret = GT_Utility.areFluidsEqual(stack, new FluidStack(fluid, 0));
- if (ret) {
- this.selectedTank = this.INTERNALTANKS.indexOf(stack);
- break;
- }
- }
- return ret;
- }
-
- @Override
- public FluidTankInfo[] getTankInfo(ForgeDirection from) {
- return new FluidTankInfo[0];
- }
-
- @Override
- public FluidStack getFluid() {
- if (this.INTERNALTANKS.get(this.selectedTank) == null || this.INTERNALTANKS.get(this.selectedTank).amount == 0)
- if (this.selectedTank > 0) this.selectedTank = this.INTERNALTANKS.size() - 1;
- return this.INTERNALTANKS.get(this.selectedTank);
- }
-
- @Override
- public int getFluidAmount() {
- return this.INTERNALTANKS.get(this.selectedTank) != null ? this.INTERNALTANKS.get(this.selectedTank).amount : 0;
- }
-
- @Override
- public void writeToNBT(NBTTagCompound compound) {
- super.writeToNBT(compound);
-
- NBTTagList lInternalTank = new NBTTagList();
-
- for (FluidStack internaltank : this.INTERNALTANKS) {
- if (internaltank != null) {
- NBTTagCompound entry = new NBTTagCompound();
- entry.setString(
- "FluidName",
- internaltank.getFluid()
- .getName());
- entry.setInteger("Ammount", internaltank.amount);
- entry.setTag("FluidTag", internaltank.tag);
- lInternalTank.appendTag(entry);
- }
- }
- compound.setTag("InternalTank", lInternalTank);
- }
-
- @Override
- public int getCapacity() {
- return Integer.MAX_VALUE;
- }
-
- @Override
- public FluidTankInfo getInfo() {
- return null;
- }
-
- @Override
- public int fill(FluidStack resource, boolean doFill) {
- if (this.worldObj.isRemote || resource == null || resource.amount == 0) return 0;
-
- if (!doFill) return resource.amount;
-
- int id = 0;
-
- if (this.canDrain(null, resource.getFluid())) {
- for (FluidStack stack : this.INTERNALTANKS) if (GT_Utility.areFluidsEqual(stack, resource)) {
- this.INTERNALTANKS.get(id = this.INTERNALTANKS.indexOf(stack)).amount += resource.amount;
- this.selectedTank = id;
- }
- } else {
- this.INTERNALTANKS.add(resource);
- id = this.INTERNALTANKS.size() - 1;
- this.selectedTank = id;
- }
- return this.INTERNALTANKS.get(id).amount;
- }
-
- @Override
- public FluidStack drain(int maxDrain, boolean doDrain) {
-
- FluidStack outputstack = this.INTERNALTANKS.get(this.selectedTank);
- if (this.worldObj.isRemote || maxDrain == 0 || this.getFluid() == null || outputstack == null) return null;
-
- int actualdrain = maxDrain;
- if (actualdrain > outputstack.amount) actualdrain = outputstack.amount;
- FluidStack ret = new FluidStack(outputstack.getFluid(), actualdrain);
- if (ret.amount == 0) ret = null;
- if (doDrain) {
- outputstack.amount -= actualdrain;
- FluidEvent.fireEvent(
- new FluidEvent.FluidDrainingEvent(
- outputstack,
- this.getWorldObj(),
- this.xCoord,
- this.yCoord,
- this.zCoord,
- this,
- actualdrain));
- }
- return ret;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java
deleted file mode 100644
index 2dcc69377e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.debug;
-
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.MetaTileEntity;
-import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Scanner;
-
-public class CreativeScanner extends GT_MetaTileEntity_Scanner {
-
- public CreativeScanner(int aID, String aName, String aNameRegional, int aTier) {
- super(aID, aName, aNameRegional, aTier);
- }
-
- public CreativeScanner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- @Override
- public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new CreativeScanner(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- this.setEUVar(this.maxEUStore());
- this.mProgresstime = this.mMaxProgresstime;
- super.onPostTick(aBaseMetaTileEntity, aTick);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java
deleted file mode 100644
index a7d8ea9db8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java
+++ /dev/null
@@ -1,836 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.ofGlassTiered;
-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.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.ofHatchAdder;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-
-import javax.annotation.Nullable;
-
-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.util.EnumChatFormatting;
-import net.minecraft.util.StatCollector;
-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.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import org.jetbrains.annotations.NotNull;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.items.LabParts;
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.net.RendererPacket;
-import com.github.bartimaeusnek.bartworks.common.tileentities.tiered.GT_MetaTileEntity_RadioHatch;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.Coords;
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-import com.github.bartimaeusnek.bartworks.util.ResultWrongSievert;
-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.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_EnhancedMultiBlockBase;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
-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.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;
-
-public class GT_TileEntity_BioVat extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_TileEntity_BioVat> {
-
- public static final HashMap<Coords, Integer> staticColorMap = new HashMap<>();
-
- private static final byte TIMERDIVIDER = 20;
-
- private final HashSet<EntityPlayerMP> playerMPHashSet = new HashSet<>();
- private final ArrayList<GT_MetaTileEntity_RadioHatch> mRadHatches = new ArrayList<>();
- private int height = 1;
- private Fluid mFluid = FluidRegistry.LAVA;
- private BioCulture mCulture;
- private ItemStack mStack;
- private boolean needsVisualUpdate = true;
- private byte mGlassTier;
- private int mSievert;
- private int mNeededSievert;
- private int mCasing = 0;
- private int mExpectedMultiplier = 0;
- private int mTimes = 0;
- private boolean isVisibleFluid = false;
-
- public GT_TileEntity_BioVat(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_BioVat(String aName) {
- super(aName);
- }
-
- private static final int CASING_INDEX = 49;
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_BioVat> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_BioVat>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] { { "ccccc", "ccccc", "ccccc", "ccccc", "ccccc" },
- { "ggggg", "gaaag", "gaaag", "gaaag", "ggggg" }, { "ggggg", "gaaag", "gaaag", "gaaag", "ggggg" },
- { "cc~cc", "ccccc", "ccccc", "ccccc", "ccccc" }, }))
- .addElement(
- 'c',
- ofChain(
- ofHatchAdder(GT_TileEntity_BioVat::addMaintenanceToMachineList, CASING_INDEX, 1),
- ofHatchAdder(GT_TileEntity_BioVat::addOutputToMachineList, CASING_INDEX, 1),
- ofHatchAdder(GT_TileEntity_BioVat::addInputToMachineList, CASING_INDEX, 1),
- ofHatchAdder(GT_TileEntity_BioVat::addRadiationInputToMachineList, CASING_INDEX, 1),
- ofHatchAdder(GT_TileEntity_BioVat::addEnergyInputToMachineList, CASING_INDEX, 1),
- onElementPass(e -> e.mCasing++, ofBlock(GregTech_API.sBlockCasings4, 1))))
- .addElement('a', ofChain(isAir(), ofBlockAnyMeta(FluidLoader.bioFluidBlock)))
- .addElement(
- 'g',
- ofGlassTiered((byte) 1, (byte) 127, (byte) 0, (te, v) -> te.mGlassTier = v, te -> te.mGlassTier, 1))
- .build();
-
- @Override
- public IStructureDefinition<GT_TileEntity_BioVat> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected IAlignmentLimits getInitialAlignmentLimits() {
- return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && f.isNotFlipped();
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Bacterial Vat")
- .addInfo("Controller block for the Bacterial Vat")
- .addInfo("For maximum efficiency boost keep the Output Hatch always half filled!")
- .addSeparator()
- .beginStructureBlock(5, 4, 5, false)
- .addController("Front bottom center")
- .addCasingInfoMin("Clean Stainless Steel Casings", 19, false)
- .addOtherStructurePart("Glass", "Hollow two middle layers", 2)
- .addStructureInfo("The glass can be any glass, i.e. Tinkers Construct Clear Glass")
- .addStructureInfo("Some Recipes need more advanced Glass Types")
- .addMaintenanceHatch("Any casing", 1)
- .addOtherStructurePart("Radio Hatch", "Any casing", 1)
- .addInputBus("Any casing", 1)
- .addOutputBus("Any casing", 1)
- .addInputHatch("Any casing", 1)
- .addOutputHatch("Any casing", 1)
- .addEnergyHatch("Any casing", 1)
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- public static int[] specialValueUnpack(int aSpecialValue) {
- int[] ret = new int[4];
- ret[0] = aSpecialValue & 0xF; // = glass tier
- ret[1] = aSpecialValue >>> 4 & 0b11; // = special value
- ret[2] = aSpecialValue >>> 6 & 0b1; // boolean exact svt | 1 = true | 0 = false
- ret[3] = aSpecialValue >>> 7 & Integer.MAX_VALUE; // = sievert
- return ret;
- }
-
- private int getInputCapacity() {
- return this.mInputHatches.stream()
- .mapToInt(GT_MetaTileEntity_Hatch_Input::getCapacity)
- .sum();
- }
-
- private int getOutputCapacity() {
- return this.mOutputHatches.stream()
- .mapToInt(GT_MetaTileEntity_Hatch_Output::getCapacity)
- .sum();
- }
-
- @Override
- public int getCapacity() {
- int ret = 0;
- ret += this.getInputCapacity();
- // ret += getOutputCapacity();
- return ret;
- }
-
- @Override
- public int fill(FluidStack resource, boolean doFill) {
- return super.fill(resource, doFill);
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return BartWorksRecipeMaps.bacterialVatRecipes;
- }
-
- /**
- * Calculates the expected output multiplier based on the output hatch
- *
- * @param recipeFluidOutput the recipe fluid output
- * @param needEqual if the recipeFluidOutput should be equal to the fluid in the output hatch
- * @return the expected output multiplier
- */
- private int getExpectedMultiplier(@Nullable FluidStack recipeFluidOutput, boolean needEqual) {
- FluidStack storedFluidOutputs = this.getStoredFluidOutputs();
- if (storedFluidOutputs == null) return 1;
- if (!needEqual || storedFluidOutputs.isFluidEqual(recipeFluidOutput)) {
- return this.calcMod(storedFluidOutputs.amount) + 1;
- }
- return 1;
- }
-
- private int calcMod(double x) {
- double y = this.getOutputCapacity() / 2D, z = ConfigHandler.bioVatMaxParallelBonus;
-
- int ret = MathUtils.ceilInt((-1D / y * Math.pow(x - y, 2D) + y) / y * z);
- return MathUtils.clamp(1, ret, ConfigHandler.bioVatMaxParallelBonus);
- }
-
- @Override
- protected ProcessingLogic createProcessingLogic() {
- return new ProcessingLogic() {
-
- @NotNull
- @Override
- protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
- if (!BW_Util.areStacksEqualOrNull(
- (ItemStack) recipe.mSpecialItems,
- GT_TileEntity_BioVat.this.getControllerSlot())) return CheckRecipeResultRegistry.NO_RECIPE;
- int[] conditions = GT_TileEntity_BioVat.specialValueUnpack(recipe.mSpecialValue);
- GT_TileEntity_BioVat.this.mNeededSievert = conditions[3];
-
- if (GT_TileEntity_BioVat.this.mGlassTier < conditions[0]) {
- return CheckRecipeResultRegistry.insufficientMachineTier(conditions[0]);
- }
-
- if (conditions[2] == 0) {
- if (GT_TileEntity_BioVat.this.mSievert < GT_TileEntity_BioVat.this.mNeededSievert) {
- return ResultWrongSievert.insufficientSievert(GT_TileEntity_BioVat.this.mNeededSievert);
- }
- } else if (GT_TileEntity_BioVat.this.mSievert != conditions[3]) {
- return ResultWrongSievert.wrongSievert(conditions[3]);
- }
-
- return CheckRecipeResultRegistry.SUCCESSFUL;
- }
-
- @NotNull
- @Override
- protected GT_ParallelHelper createParallelHelper(@NotNull GT_Recipe recipe) {
- return super.createParallelHelper(recipeWithMultiplier(recipe, inputFluids));
- }
- };
- }
-
- protected GT_Recipe recipeWithMultiplier(GT_Recipe recipe, FluidStack[] fluidInputs) {
- GT_Recipe tRecipe = recipe.copy();
- int multiplier = getExpectedMultiplier(recipe.getFluidOutput(0), true);
- mExpectedMultiplier = multiplier;
- // Calculate max multiplier limited by input fluids
- long fluidAmount = 0;
- for (FluidStack fluid : fluidInputs) {
- if (recipe.mFluidInputs[0].isFluidEqual(fluid)) {
- fluidAmount += fluid.amount;
- }
- }
- multiplier = (int) Math.min(multiplier, fluidAmount / recipe.mFluidInputs[0].amount);
- // In case multiplier is 0
- multiplier = Math.max(multiplier, 1);
- mTimes = multiplier;
- tRecipe.mFluidInputs[0].amount *= multiplier;
- tRecipe.mFluidOutputs[0].amount *= multiplier;
- return tRecipe;
- }
-
- @Override
- protected void setupProcessingLogic(ProcessingLogic logic) {
- super.setupProcessingLogic(logic);
- logic.setSpecialSlotItem(this.getControllerSlot());
- }
-
- public FluidStack getStoredFluidOutputs() {
- // Only one output Hatch
- assert this.mOutputHatches.size() == 1;
- return this.mOutputHatches.get(0)
- .getFluid();
- }
-
- private boolean addRadiationInputToMachineList(IGregTechTileEntity aTileEntity, int CasingIndex) {
- if (aTileEntity == null) {
- return false;
- }
- IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
- if (aMetaTileEntity == null || !(aMetaTileEntity instanceof GT_MetaTileEntity_RadioHatch)) {
- return false;
- } else {
- ((GT_MetaTileEntity_RadioHatch) aMetaTileEntity).updateTexture(CasingIndex);
- return this.mRadHatches.add((GT_MetaTileEntity_RadioHatch) aMetaTileEntity);
- }
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
- this.mRadHatches.clear();
- this.mGlassTier = 0;
- this.mCasing = 0;
-
- if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 2, 3, 0)) return false;
-
- return this.mCasing >= 19 && this.mRadHatches.size() <= 1
- && this.mOutputHatches.size() == 1
- && this.mMaintenanceHatches.size() == 1
- && this.mInputHatches.size() > 0
- && this.mEnergyHatches.size() > 0;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- private void sendAllRequiredRendererPackets() {
- int height = this.reCalculateHeight();
- if (this.mFluid != null && height > 1 && this.reCalculateFluidAmmount() > 0) {
- for (int x = -1; x < 2; x++) for (int y = 1; y < height; y++)
- for (int z = -1; z < 2; z++) this.sendPackagesOrRenewRenderer(x, y, z, this.mCulture);
- }
- }
-
- private void sendPackagesOrRenewRenderer(int x, int y, int z, BioCulture lCulture) {
- int xDir = this.getXDir();
- int zDir = this.getZDir();
-
- GT_TileEntity_BioVat.staticColorMap.remove(
- new Coords(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord(),
- this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId));
- GT_TileEntity_BioVat.staticColorMap.put(
- new Coords(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord(),
- this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId),
- lCulture == null ? BioCulture.NULLCULTURE.getColorRGB() : lCulture.getColorRGB());
-
- if (SideReference.Side.Server) {
- MainMod.BW_Network_instance.sendPacketToAllPlayersInRange(
- this.getBaseMetaTileEntity()
- .getWorld(),
- new RendererPacket(
- new Coords(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord(),
- this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId),
- lCulture == null ? BioCulture.NULLCULTURE.getColorRGB() : lCulture.getColorRGB(),
- true),
- this.getBaseMetaTileEntity()
- .getXCoord(),
- this.getBaseMetaTileEntity()
- .getZCoord());
- MainMod.BW_Network_instance.sendPacketToAllPlayersInRange(
- this.getBaseMetaTileEntity()
- .getWorld(),
- new RendererPacket(
- new Coords(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord(),
- this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId),
- lCulture == null ? BioCulture.NULLCULTURE.getColorRGB() : lCulture.getColorRGB(),
- false),
- this.getBaseMetaTileEntity()
- .getXCoord(),
- this.getBaseMetaTileEntity()
- .getZCoord());
- }
- this.needsVisualUpdate = true;
- }
-
- private void check_Chunk() {
- World aWorld = this.getBaseMetaTileEntity()
- .getWorld();
- if (!aWorld.isRemote) {
-
- for (Object tObject : aWorld.playerEntities) {
- if (!(tObject instanceof EntityPlayerMP tPlayer)) {
- break;
- }
- Chunk tChunk = aWorld.getChunkFromBlockCoords(
- this.getBaseMetaTileEntity()
- .getXCoord(),
- this.getBaseMetaTileEntity()
- .getZCoord());
- if (tPlayer.getServerForPlayer()
- .getPlayerManager()
- .isPlayerWatchingChunk(tPlayer, tChunk.xPosition, tChunk.zPosition)) {
- if (!this.playerMPHashSet.contains(tPlayer)) {
- this.playerMPHashSet.add(tPlayer);
- this.sendAllRequiredRendererPackets();
- }
- } else {
- this.playerMPHashSet.remove(tPlayer);
- }
- }
- }
- }
-
- private void placeFluid() {
- this.isVisibleFluid = true;
- int xDir = this.getXDir();
- int zDir = this.getZDir();
- this.height = this.reCalculateHeight();
- if (this.mFluid != null && this.height > 1 && this.reCalculateFluidAmmount() > 0) for (int x = -1; x < 2; x++) {
- for (int y = 0; y < this.height; y++) {
- for (int z = -1; z < 2; z++) {
- if (this.getBaseMetaTileEntity()
- .getWorld()
- .getBlock(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord())
- .equals(Blocks.air))
- this.getBaseMetaTileEntity()
- .getWorld()
- .setBlock(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord(),
- FluidLoader.bioFluidBlock);
- }
- }
- }
- }
-
- private void removeFluid(int xDir, int zDir) {
- this.isVisibleFluid = false;
-
- for (int x = -1; x < 2; x++) {
- for (int y = 1; y < 3; y++) {
- for (int z = -1; z < 2; z++) {
- if (this.getBaseMetaTileEntity()
- .getWorld()
- .getBlock(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord())
- .equals(FluidLoader.bioFluidBlock))
- this.getBaseMetaTileEntity()
- .getWorld()
- .setBlockToAir(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord());
- GT_TileEntity_BioVat.staticColorMap.remove(
- new Coords(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord()),
- this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId);
- }
- }
- }
- }
-
- private int reCalculateFluidAmmount() {
- return this.getStoredFluids()
- .stream()
- .mapToInt(fluidStack -> fluidStack.amount)
- .sum();
- }
-
- private int reCalculateHeight() {
- return this.reCalculateFluidAmmount() > this.getCapacity() / 4 - 1
- ? this.reCalculateFluidAmmount() >= this.getCapacity() / 2 ? 3 : 2
- : 1;
- }
-
- public void doAllVisualThings() {
- if (this.getBaseMetaTileEntity()
- .isServerSide()) {
- if (this.mMachine) {
- ItemStack aStack = this.mInventory[1];
- BioCulture lCulture = null;
- int xDir = this.getXDir();
- int zDir = this.getZDir();
-
- if (this.getBaseMetaTileEntity()
- .getTimer() % 200 == 0) {
- this.check_Chunk();
- }
-
- if (this.needsVisualUpdate && this.getBaseMetaTileEntity()
- .getTimer() % GT_TileEntity_BioVat.TIMERDIVIDER == 0) {
- for (int x = -1; x < 2; x++)
- for (int y = 1; y < 3; y++) for (int z = -1; z < 2; z++) this.getBaseMetaTileEntity()
- .getWorld()
- .setBlockToAir(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord());
- }
-
- this.height = this.reCalculateHeight();
- if (this.mFluid != null && this.height > 1 && this.reCalculateFluidAmmount() > 0) {
- if (!BW_Util.areStacksEqualOrNull(aStack, this.mStack)
- || this.needsVisualUpdate && this.getBaseMetaTileEntity()
- .getTimer() % GT_TileEntity_BioVat.TIMERDIVIDER == 1) {
- for (int x = -1; x < 2; x++) {
- for (int y = 1; y < this.height; y++) {
- for (int z = -1; z < 2; z++) {
- if (aStack == null
- || aStack.getItem() instanceof LabParts && aStack.getItemDamage() == 0) {
- if (this.mCulture == null || aStack == null
- || aStack.getTagCompound() == null
- || this.mCulture.getID() != aStack.getTagCompound()
- .getInteger("ID")) {
- lCulture = aStack == null || aStack.getTagCompound() == null ? null
- : BioCulture.getBioCulture(
- aStack.getTagCompound()
- .getString("Name"));
- this.sendPackagesOrRenewRenderer(x, y, z, lCulture);
- }
- }
- }
- }
- }
- this.mStack = aStack;
- this.mCulture = lCulture;
- }
- if (this.needsVisualUpdate && this.getBaseMetaTileEntity()
- .getTimer() % GT_TileEntity_BioVat.TIMERDIVIDER == 1) {
- if (this.getBaseMetaTileEntity()
- .isClientSide()) new Throwable().printStackTrace();
- this.placeFluid();
- this.needsVisualUpdate = false;
- }
- }
- } else {
- this.onRemoval();
- }
- }
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- super.onPostTick(aBaseMetaTileEntity, aTick);
- if (this.height != this.reCalculateHeight()) this.needsVisualUpdate = true;
- this.doAllVisualThings();
- if (this.getBaseMetaTileEntity()
- .isServerSide() && this.mRadHatches.size() == 1) {
- this.mSievert = this.mRadHatches.get(0)
- .getSievert();
- if (this.getBaseMetaTileEntity()
- .isActive() && this.mNeededSievert > this.mSievert) this.mOutputFluids = null;
- }
- if (aBaseMetaTileEntity.isServerSide() && this.mMaxProgresstime <= 0) {
- this.mTimes = 0;
- this.mMaxProgresstime = 0;
- }
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- aNBT.setInteger("mFluidHeight", this.height);
- if (this.mCulture != null && !this.mCulture.getName()
- .isEmpty()) aNBT.setString("mCulture", this.mCulture.getName());
- else if ((this.mCulture == null || this.mCulture.getName()
- .isEmpty()) && !aNBT.getString("mCulture")
- .isEmpty()) {
- aNBT.removeTag("mCulture");
- }
- if (this.mFluid != null) aNBT.setString("mFluid", this.mFluid.getName());
- aNBT.setInteger("mSievert", this.mSievert);
- aNBT.setInteger("mNeededSievert", this.mNeededSievert);
- aNBT.setBoolean("isVisibleFluid", this.isVisibleFluid);
- super.saveNBTData(aNBT);
- }
-
- @Override
- public void onRemoval() {
- if (this.isVisibleFluid) {
- int xDir = this.getXDir();
- int zDir = this.getZDir();
- this.removeFluid(xDir, zDir);
- this.sendRenderPackets(xDir, zDir);
- } else if (this.getBaseMetaTileEntity()
- .getWorld()
- .getWorldTime() % 20 == 7) {
- this.sendRenderPackets();
- }
-
- super.onRemoval();
- }
-
- private int getXDir() {
- return this.getBaseMetaTileEntity()
- .getBackFacing().offsetX * 2;
- }
-
- private int getZDir() {
- return this.getBaseMetaTileEntity()
- .getBackFacing().offsetZ * 2;
- }
-
- private void sendRenderPackets() {
- int xDir = this.getXDir();
- int zDir = this.getZDir();
- this.sendRenderPackets(xDir, zDir);
- }
-
- private void sendRenderPackets(int xDir, int zDir) {
- if (SideReference.Side.Server) {
- for (int x = -1; x < 2; x++) {
- for (int y = 1; y < 3; y++) {
- for (int z = -1; z < 2; z++) {
- MainMod.BW_Network_instance.sendPacketToAllPlayersInRange(
- this.getBaseMetaTileEntity()
- .getWorld(),
- new RendererPacket(
- new Coords(
- xDir + x
- + this.getBaseMetaTileEntity()
- .getXCoord(),
- y + this.getBaseMetaTileEntity()
- .getYCoord(),
- zDir + z
- + this.getBaseMetaTileEntity()
- .getZCoord(),
- this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId),
- this.mCulture == null ? BioCulture.NULLCULTURE.getColorRGB()
- : this.mCulture.getColorRGB(),
- true),
- this.getBaseMetaTileEntity()
- .getXCoord(),
- this.getBaseMetaTileEntity()
- .getZCoord());
- }
- }
- }
- }
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- this.height = aNBT.getInteger("mFluidHeight");
- this.mCulture = BioCulture.getBioCulture(aNBT.getString("mCulture"));
- if (!aNBT.getString("mFluid")
- .isEmpty()) this.mFluid = FluidRegistry.getFluid(aNBT.getString("mFluid"));
- this.mSievert = aNBT.getInteger("mSievert");
- this.mNeededSievert = aNBT.getInteger("mNeededSievert");
- super.loadNBTData(aNBT);
- this.isVisibleFluid = aNBT.getBoolean("isVisibleFluid");
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_BioVat(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(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[] { Textures.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 void construct(ItemStack itemStack, boolean b) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 2, 3, 0);
- }
-
- @Override
- public String[] getInfoData() {
- final String[] baseInfoData = super.getInfoData();
- final String[] infoData = new String[baseInfoData.length + 2];
- System.arraycopy(baseInfoData, 0, infoData, 0, baseInfoData.length);
- // See https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues/11923
- // here we must check the machine is well-formed as otherwise getExpectedMultiplier might error out!
- infoData[infoData.length - 2] = StatCollector.translateToLocal("BW.infoData.BioVat.expectedProduction") + ": "
- + EnumChatFormatting.GREEN
- + (this.mMachine
- ? (this.mMaxProgresstime <= 0 ? this.getExpectedMultiplier(null, false) : this.mExpectedMultiplier)
- * 100
- : -1)
- + EnumChatFormatting.RESET
- + " %";
- infoData[infoData.length - 1] = StatCollector.translateToLocal("BW.infoData.BioVat.production") + ": "
- + EnumChatFormatting.GREEN
- + (this.mMaxProgresstime <= 0 ? 0 : this.mTimes) * 100
- + EnumChatFormatting.RESET
- + " %";
- return infoData;
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-
- @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, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- return false;
- }
-
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java
deleted file mode 100644
index 1f85ea0167..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS;
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.ofGlassTieredMixed;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
-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.SoundResource.IC2_MACHINES_MAGNETIZER_LOOP;
-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.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
-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.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.util.ForgeDirection;
-
-import org.jetbrains.annotations.NotNull;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.BW_Meta_Items;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.CircuitImprintLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-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.CycleButtonWidget;
-import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
-
-import gregtech.api.GregTech_API;
-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.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;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
-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.render.TextureFactory;
-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 mcp.mobius.waila.api.IWailaConfigHandler;
-import mcp.mobius.waila.api.IWailaDataAccessor;
-
-public class GT_TileEntity_CircuitAssemblyLine extends
- GT_MetaTileEntity_EnhancedMultiBlockBase<GT_TileEntity_CircuitAssemblyLine> implements ISurvivalConstructable {
-
- private static final int CASING_INDEX = 16;
-
- private static final String STRUCTURE_PIECE_FIRST = "first";
- private static final String STRUCTURE_PIECE_NEXT = "next";
- private static final String STRUCTURE_PIECE_NEXT_HINT = "next_hint";
- private static final String STRUCTURE_PIECE_LAST = "last";
-
- private static final int MINIMUM_CIRCUIT_ASSEMBLER_LENGTH = 5;
- protected static final String IMPRINT_KEY = "Type";
- protected static final String LENGTH_KEY = "Length";
- protected static final String RUNNING_MODE_KEY = "RunningMode";
-
- private int length;
- private int mode;
- private String imprintedItemName;
- private ItemStack imprintedStack;
-
- private static final IStructureDefinition<GT_TileEntity_CircuitAssemblyLine> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_CircuitAssemblyLine>builder()
- .addShape(
- STRUCTURE_PIECE_FIRST,
- transpose(new String[][] { { "~", "G", "G" }, { "g", "l", "g" }, { "b", "i", "b" }, }))
- .addShape(
- STRUCTURE_PIECE_NEXT,
- transpose(new String[][] { { "G", "G", "G" }, { "g", "l", "g" }, { "b", "I", "b" }, }))
- .addShape(
- STRUCTURE_PIECE_NEXT_HINT,
- transpose(new String[][] { { "G", "G", "G" }, { "g", "l", "g" }, { "b", "i", "b" }, }))
- .addShape(
- STRUCTURE_PIECE_LAST,
- transpose(new String[][] { { "G", "G", "G" }, { "g", "l", "g" }, { "b", "o", "b" }, }))
- .addElement(
- 'G',
- buildHatchAdder(GT_TileEntity_CircuitAssemblyLine.class).atLeast(Energy)
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(GregTech_API.sBlockCasings3, 10))
- .addElement('g', ofGlassTieredMixed((byte) 4, (byte) 127, 5))
- .addElement('l', ofBlock(GregTech_API.sBlockCasings2, 5)) // assembling line casings
- .addElement(
- 'b',
- buildHatchAdder(GT_TileEntity_CircuitAssemblyLine.class).atLeast(InputHatch, Maintenance)
- .casingIndex(CASING_INDEX)
- .dot(2)
- .disallowOnly(ForgeDirection.EAST, ForgeDirection.WEST)
- .buildAndChain(GregTech_API.sBlockCasings2, 0))
- .addElement('i', InputBus.newAny(CASING_INDEX, 3, ForgeDirection.DOWN))
- .addElement(
- 'I',
- buildHatchAdder(GT_TileEntity_CircuitAssemblyLine.class).atLeast(InputHatch, InputBus, OutputBus)
- .casingIndex(CASING_INDEX)
- .dot(2)
- .disallowOnly(ForgeDirection.EAST, ForgeDirection.WEST)
- .buildAndChain(GregTech_API.sBlockCasings2, 0))
- .addElement('o', OutputBus.newAny(CASING_INDEX, 2, ForgeDirection.DOWN))
- .build();
-
- @Override
- public IStructureDefinition<GT_TileEntity_CircuitAssemblyLine> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Circuit Assembler/Circuit Assembly Line")
- .addInfo("Controller block for the Circuit Assembly Line")
- .addInfo("Change Mode with Screwdriver")
- .addInfo("Does not lose efficiency when overclocked")
- .addInfo(
- "---------" + EnumChatFormatting.WHITE
- + StatCollector.translateToLocal("chat.cal.mode.0")
- + EnumChatFormatting.GRAY
- + "--------")
- .addInfo("Imprint this machine with a Circuit Imprint,")
- .addInfo("by putting the imprint in the controller")
- .addInfo("Every Circuit Assembly Line can only be imprinted ONCE")
- .addInfo(
- "---------" + EnumChatFormatting.WHITE
- + StatCollector.translateToLocal("chat.cal.mode.1")
- + EnumChatFormatting.GRAY
- + "--------")
- .addInfo(
- "Does Circuit Assembler recipes, Minimum Length: " + EnumChatFormatting.RED
- + MINIMUM_CIRCUIT_ASSEMBLER_LENGTH
- + EnumChatFormatting.GRAY)
- .addInfo("Recipe tier in Circuit Assembler mode is at most Energy Hatch tier - 1.")
- .addInfo("This mode supports Crafting Input Buffer/Bus and allows bus separation")
- .addInfo("")
- .addSeparator()
- .addInfo(BW_Tooltip_Reference.TT_BLUEPRINT)
- .beginVariableStructureBlock(2, 7, 3, 3, 3, 3, false)
- .addStructureInfo("From Bottom to Top, Left to Right")
- .addStructureInfo(
- "Layer 1 - Solid Steel Machine Casing, Input bus (Last Output bus), Solid Steel Machine Casing")
- .addStructureInfo("Layer 2 - EV+ Tier Glass, Assembling Line Casing, EV+ Tier Glass")
- .addStructureInfo("Layer 3 - Grate Machine Casing")
- .addStructureInfo("Up to 7 repeating slices, last is Output Bus")
- .addController("Layer 3 first slice front")
- .addOtherStructurePart(
- "1x " + StatCollector.translateToLocal("GT5U.MBTT.EnergyHatch"),
- "Any layer 3 casing",
- 1)
- .addInputHatch("Any layer 1 casing", 2)
- .addInputBus("As specified on layer 1", 3, 4)
- .addOutputBus("As specified in final slice on layer 1", 4)
- .addOtherStructurePart("EV+ Tier Glass", "As specified on layer 2", 5)
- .addMaintenanceHatch("Any layer 1 casing", 2)
- .toolTipFinisher(ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get());
- return tt;
- }
-
- public String getTypeForDisplay() {
-
- if (this.type.equals(new NBTTagCompound())) return "";
- return GT_LanguageManager.getTranslation(
- GT_LanguageManager.getTranslateableItemStackName(CircuitImprintLoader.getStackFromTag(this.type)));
- }
-
- private NBTTagCompound type = new NBTTagCompound();
-
- public GT_TileEntity_CircuitAssemblyLine(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- private GT_TileEntity_CircuitAssemblyLine(String aName) {
- super(aName);
- }
-
- private boolean imprintMachine(ItemStack itemStack) {
- if (!this.type.equals(new NBTTagCompound())) return true;
- if (!GT_Utility.isStackValid(itemStack)) return false;
- if (itemStack.getItem() instanceof BW_Meta_Items.BW_GT_MetaGenCircuits && itemStack.getItemDamage() == 0
- && itemStack.getTagCompound() != null
- && this.type.equals(new NBTTagCompound())) {
- this.type = itemStack.getTagCompound();
- this.mInventory[1] = null;
- this.getBaseMetaTileEntity()
- .issueBlockUpdate();
- return true;
- }
- return false;
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
- super.startSoundLoop(aIndex, aX, aY, aZ);
- if (aIndex == 20) {
- GT_Utility.doSoundAtClient(IC2_MACHINES_MAGNETIZER_LOOP, 10, 1.0F, aX, aY, aZ);
- }
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- this.type = aNBT.getCompoundTag(IMPRINT_KEY);
- this.imprintedItemName = this.type == null ? ""
- : GT_LanguageManager.getTranslateableItemStackName(ItemStack.loadItemStackFromNBT(this.type));
- mode = aNBT.getInteger(RUNNING_MODE_KEY);
- length = aNBT.getInteger(LENGTH_KEY);
- super.loadNBTData(aNBT);
- }
-
- @Override
- public void setItemNBT(NBTTagCompound aNBT) {
- if (!this.type.equals(new NBTTagCompound())) aNBT.setTag(IMPRINT_KEY, this.type);
- aNBT.setInteger(RUNNING_MODE_KEY, mode);
- aNBT.setInteger(LENGTH_KEY, length);
- super.saveNBTData(aNBT);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- if (!this.type.equals(new NBTTagCompound())) aNBT.setTag(IMPRINT_KEY, this.type);
- aNBT.setInteger(RUNNING_MODE_KEY, mode);
- aNBT.setInteger(LENGTH_KEY, length);
- super.saveNBTData(aNBT);
- }
-
- @Override
- public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- if (getBaseMetaTileEntity().isServerSide()) {
- this.mode = (this.mode + 1) % 2;
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("chat.cal.mode." + this.mode));
- }
- super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- if (this.mode == 0) return BartWorksRecipeMaps.circuitAssemblyLineRecipes;
- return RecipeMaps.circuitAssemblerRecipes;
- }
-
- @Nonnull
- @Override
- public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
- return Arrays.asList(BartWorksRecipeMaps.circuitAssemblyLineRecipes, RecipeMaps.circuitAssemblerRecipes);
- }
-
- @Override
- protected ProcessingLogic createProcessingLogic() {
- return new ProcessingLogic() {
-
- @Override
- @Nonnull
- protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
- // limit CA mode recipes to hatch tier - 1
- if (GT_TileEntity_CircuitAssemblyLine.this.mode == 1
- && recipe.mEUt > GT_TileEntity_CircuitAssemblyLine.this.getMaxInputVoltage() / 4) {
- return CheckRecipeResultRegistry.NO_RECIPE;
- }
- return CheckRecipeResultRegistry.SUCCESSFUL;
- }
- }.enablePerfectOverclock();
- }
-
- @NotNull
- @Override
- public CheckRecipeResult checkProcessing() {
- if (mode == 0) {
- if (this.type.equals(new NBTTagCompound()) && !this.imprintMachine(this.getControllerSlot()))
- return SimpleCheckRecipeResult.ofFailure("no_imprint");
- if (this.imprintedItemName == null || this.imprintedStack == null) {
- this.imprintedStack = new ItemStack(BW_Meta_Items.getNEWCIRCUITS(), 1, 0);
- this.imprintedStack.setTagCompound(this.type);
- this.imprintedItemName = GT_LanguageManager.getTranslateableItemStackName(this.imprintedStack);
- }
- } else if (length < MINIMUM_CIRCUIT_ASSEMBLER_LENGTH) {
- return SimpleCheckRecipeResult.ofFailure("not_enough_length");
- }
-
- return super.checkProcessing();
- }
-
- @Override
- protected void setupProcessingLogic(ProcessingLogic logic) {
- super.setupProcessingLogic(logic);
- logic.setSpecialSlotItem(this.imprintedStack);
- }
-
- @Override
- protected SoundResource getProcessStartSound() {
- return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP;
- }
-
- @Override
- public ArrayList<ItemStack> getStoredInputs() {
- if (mode == 0) {
- ArrayList<ItemStack> rList = new ArrayList<>();
- for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) {
- tHatch.mRecipeMap = this.getRecipeMap();
- for (int i = 0; i < tHatch.getBaseMetaTileEntity()
- .getSizeInventory(); i++) {
- if (tHatch.getBaseMetaTileEntity()
- .getStackInSlot(i) != null) {
- rList.add(
- tHatch.getBaseMetaTileEntity()
- .getStackInSlot(i));
- break;
- }
- }
- }
- return rList;
- }
-
- return super.getStoredInputs();
- }
-
- @Override
- public boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
- if (aTileEntity == null) {
- return false;
- }
- IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
- if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
- ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
- ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = this.getRecipeMap();
- return this.mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
- } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
- ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
- ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = this.getRecipeMap();
- return this.mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity);
- } else {
- return false;
- }
- }
-
- @Override
- public boolean addInputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
- if (aTileEntity == null) {
- return false;
- }
- IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
- if (aMetaTileEntity == null || !(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input)) {
- return false;
- } else {
- ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
- ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = this.getRecipeMap();
- return this.mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
- }
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_CircuitAssemblyLine(this.mName);
- }
-
- private String[] infoDataBuffer;
-
- @Override
- public String[] getInfoData() {
- if (this.infoDataBuffer != null) return this.infoDataBuffer;
-
- String[] oldInfo = super.getInfoData();
- this.infoDataBuffer = new String[oldInfo.length + 1];
- System.arraycopy(oldInfo, 0, this.infoDataBuffer, 0, oldInfo.length);
- this.infoDataBuffer[oldInfo.length] = StatCollector.translateToLocal("tooltip.cal.imprintedWith") + " "
- + EnumChatFormatting.YELLOW
- + this.getTypeForDisplay();
- return this.infoDataBuffer;
- }
-
- @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(CASING_INDEX),
- 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), 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.getCasingTextureForId(CASING_INDEX) };
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
- if (!this.checkPiece(STRUCTURE_PIECE_FIRST, 0, 0, 0)) {
- return false;
- }
- return this.checkMachine(true) || this.checkMachine(false);
- }
-
- private boolean checkMachine(boolean leftToRight) {
-
- for (int i = 1; i < 7; ++i) {
- if (!this.checkPiece(STRUCTURE_PIECE_NEXT, leftToRight ? -i : i, 0, 0)) {
- return false;
- }
- length = i + 1;
-
- if (!this.mOutputBusses.isEmpty()) {
- return this.mEnergyHatches.size() == 1 && this.mMaintenanceHatches.size() == 1;
- }
- }
-
- return false;
- }
-
- public void construct(ItemStack stackSize, boolean hintsOnly) {
- this.buildPiece(STRUCTURE_PIECE_FIRST, stackSize, hintsOnly, 0, 0, 0);
- int tLength = Math.min(stackSize.stackSize + 1, 7);
-
- for (int i = 1; i < tLength; ++i) {
- this.buildPiece(STRUCTURE_PIECE_NEXT, stackSize, hintsOnly, -i, 0, 0);
- }
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
- if (this.mMachine) return -1;
- int built;
- built = survivialBuildPiece(STRUCTURE_PIECE_FIRST, stackSize, 0, 0, 0, elementBudget, env, false, true);
- if (built >= 0) return built;
- int tLength = Math.min(stackSize.stackSize + 1, 7);
-
- for (int i = 1; i < tLength - 1; ++i) {
- built = survivialBuildPiece(
- STRUCTURE_PIECE_NEXT_HINT,
- stackSize,
- -i,
- 0,
- 0,
- elementBudget,
- env,
- false,
- true);
- if (built >= 0) return built;
- }
- return survivialBuildPiece(
- STRUCTURE_PIECE_LAST,
- stackSize,
- -(tLength - 1),
- 0,
- 0,
- elementBudget,
- env,
- false,
- true);
- }
-
- @Override
- public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
- if (stack.hasTagCompound() && stack.stackTagCompound.hasKey(IMPRINT_KEY)) {
- tooltip.add(
- StatCollector.translateToLocal("tooltip.cal.imprintedWith") + " "
- + EnumChatFormatting.YELLOW
- + StatCollector.translateToLocal(
- GT_LanguageManager.getTranslateableItemStackName(
- ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("Type")))));
- }
- }
-
- @Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- super.addUIWidgets(builder, buildContext);
- builder
- .widget(new FakeSyncWidget.StringSyncer(() -> this.imprintedItemName, val -> this.imprintedItemName = val));
- builder.widget(
- new CycleButtonWidget().setToggle(() -> mode == 1, val -> mode = val ? 1 : 0)
- .setTextureGetter(
- state -> state == 1 ? BW_UITextures.OVERLAY_BUTTON_ASSEMBLER_MODE
- : BW_UITextures.OVERLAY_BUTTON_LINE_MODE)
- .setBackground(GT_UITextures.BUTTON_STANDARD)
- .setPos(80, 91)
- .setSize(16, 16)
- .dynamicTooltip(
- () -> Collections.singletonList(StatCollector.translateToLocal("chat.cal.mode." + mode)))
- .setUpdateTooltipEveryTick(true)
- .setTooltipShowUpDelay(TOOLTIP_DELAY));
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-
- @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()) {
- if (mode == 0) return false;
- inputSeparation = !inputSeparation;
- GT_Utility.sendChatToPlayer(
- aPlayer,
- StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
- return true;
- } else {
- batchMode = !batchMode;
- if (batchMode) {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- }
-
- @Override
- public boolean supportsInputSeparation() {
- return mode != 0;
- }
-
- @Override
- public boolean isInputSeparationEnabled() {
- return mode == 1 && super.isInputSeparationEnabled();
- }
-
- @Override
- public boolean isRecipeLockingEnabled() {
- return this.mode == 0 && this.imprintedItemName != null && !"".equals(this.imprintedItemName);
- }
-
- @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(
- EnumChatFormatting.GREEN
- + StatCollector.translateToLocal("chat.cal.mode." + tag.getInteger(RUNNING_MODE_KEY)));
- if (tag.hasKey("ImprintedWith") && tag.getInteger(RUNNING_MODE_KEY) == 0) currenttip.add(
- StatCollector.translateToLocal("tooltip.cal.imprintedWith") + " "
- + EnumChatFormatting.YELLOW
- + tag.getString("ImprintedWith"));
-
- }
-
- @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);
- String imprintedWith = this.getTypeForDisplay();
- if (!imprintedWith.isEmpty()) tag.setString("ImprintedWith", imprintedWith);
- tag.setInteger(RUNNING_MODE_KEY, mode);
- }
-
- @Override
- protected boolean supportsCraftingMEBuffer() {
- return mode != 0;
- }
-
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java
deleted file mode 100644
index f394089fb0..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS;
-import static gregtech.api.enums.GT_Values.VN;
-
-import java.lang.reflect.Field;
-import java.util.Arrays;
-
-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 net.minecraftforge.fluids.FluidRegistry;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-import gregtech.api.enums.GT_Values;
-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.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
-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_Utility;
-import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DrillerBase;
-import ic2.core.block.reactor.tileentity.TileEntityNuclearReactorElectric;
-
-public class GT_TileEntity_DEHP extends GT_MetaTileEntity_DrillerBase {
-
- private static float nulearHeatMod = 2f;
- private byte mMode;
- private byte mTier;
-
- public GT_TileEntity_DEHP(int aID, int tier, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- this.mTier = (byte) tier;
- }
-
- public GT_TileEntity_DEHP(String aName, byte mTier) {
- super(aName);
- this.mTier = mTier;
- }
-
- @Override
- @SuppressWarnings("rawtypes")
- public void onConfigLoad(GT_Config aConfig) {
- try {
- Class c = TileEntityNuclearReactorElectric.class;
- Field f = c.getDeclaredField("huOutputModifier");
- f.setAccessible(true);
- GT_TileEntity_DEHP.nulearHeatMod = f.getFloat(f);
- } catch (SecurityException | IllegalArgumentException | ExceptionInInitializerError | NullPointerException
- | IllegalAccessException | NoSuchFieldException e) {
- e.printStackTrace();
- }
- super.onConfigLoad(aConfig);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- aNBT.setByte("mTier", this.mTier);
- aNBT.setByte("mMode", this.mMode);
- super.saveNBTData(aNBT);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- this.mTier = aNBT.getByte("mTier");
- this.mMode = aNBT.getByte("mMode");
- super.loadNBTData(aNBT);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_DEHP(this.mName, this.mTier);
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- String casings = this.getCasingBlockItem()
- .get(0)
- .getDisplayName();
- tt.addMachineType("Geothermal Heat Pump")
- .addInfo("Consumes " + GT_Values.V[this.mTier + 2] + "EU/t")
- .addInfo("Has 4 Modes, use the Screwdriver to change them:");
- if (ConfigHandler.DEHPDirectSteam) {
- tt.addInfo("0 Idle, 1 Steam, 2 Superheated Steam (requires Distilled Water), 3 Retract")
- .addInfo("Explodes when it runs out of Water/Distilled Water")
- .addInfo(
- "Converts " + (long) (this.mTier * 1200 * 20)
- + "L/s Water(minus 10% per Maintenance Problem) to Steam")
- .addInfo(
- "Converts " + (long) (this.mTier * 600 * 20)
- + "L/s Distilled Water(minus 10% per Maintenance Problem) to SuperheatedSteam");
-
- } else {
- tt.addInfo("0 Idle, 1 & 2 Coolant Heating Mode (no Difference between them), 3 Retract")
- .addInfo("Explodes when it runs out of Coolant")
- .addInfo(
- "Heats up " + (long) (this.mTier * 24 * (double) GT_TileEntity_DEHP.nulearHeatMod) * 20
- + "L/s Coolant(minus 10% per Maintenance Problem)");
- }
- tt.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(
- this.getFrameMaterial().mName + " Frame Boxes",
- "Each pillar's side and 1x3x1 on top")
- .addEnergyHatch(VN[this.getMinTier()] + "+, Any base casing")
- .addMaintenanceHatch("Any base casing")
- .addInputBus("Mining Pipes, optional, any base casing")
- .addInputHatch("Any base casing")
- .addOutputHatch("Any base casing")
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS);
- return tt;
- }
-
- @Override
- protected ItemList getCasingBlockItem() {
- return ItemList.Casing_HeatProof;
- }
-
- @Override
- protected Materials getFrameMaterial() {
- return Materials.Tungsten;
- }
-
- @Override
- protected int getCasingTextureIndex() {
- return 11;
- }
-
- @Override
- protected int getMinTier() {
- return 2 + this.mTier;
- }
-
- @Override
- protected boolean checkHatches() {
- return !this.mMaintenanceHatches.isEmpty() && !this.mOutputHatches.isEmpty() && !this.mInputHatches.isEmpty();
- }
-
- private long getFluidFromHatches(Fluid f) {
- long ret = 0;
- for (GT_MetaTileEntity_Hatch_Input ih : this.mInputHatches) {
- if (ih.getFluid()
- .getFluid()
- .equals(f)) ret += ih.getFluidAmount();
- }
- return ret;
- }
-
- private long getWaterFromHatches(boolean onlyDistilled) {
- Fluid toConsume1 = FluidRegistry.WATER;
- Fluid toConsume2 = GT_ModHandler.getDistilledWater(1L)
- .getFluid();
- if (onlyDistilled) toConsume1 = toConsume2;
- long ret = 0;
- for (GT_MetaTileEntity_Hatch_Input ih : this.mInputHatches) {
- if (ih.getFluid()
- .getFluid()
- .equals(toConsume1)
- || ih.getFluid()
- .getFluid()
- .equals(toConsume2))
- ret += ih.getFluidAmount();
- }
- return ret;
- }
-
- @Override
- protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
- int yHead, int oldYHead) {
- if (this.mMode != 3) {
- this.isPickingPipes = false;
- try {
- Field workState = this.getClass()
- .getField("workState");
- workState.setInt(this, 0);
- } catch (NoSuchFieldError | NoSuchFieldException | IllegalAccessException ignored) {}
- return true;
- }
- return super.workingUpward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
- }
-
- @Override
- public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- if (this.getBaseMetaTileEntity()
- .getWorld().isRemote) return;
- ++this.mMode;
- if (this.mMode >= 4) this.mMode = 0;
- GT_Utility.sendChatToPlayer(aPlayer, "Mode: " + this.mMode);
- super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
- }
-
- @Override
- protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
- int yHead, int oldYHead) {
- if (this.mMode == 3) {
- this.isPickingPipes = true;
- try {
- Field workState = this.getClass()
- .getSuperclass()
- .getDeclaredField("workState");
- workState.setInt(this, 2);
- } catch (NoSuchFieldError | NoSuchFieldException | IllegalAccessException ignored) {}
- return true;
- }
-
- if (this.tryLowerPipeState(false) == 0) {
- return true;
- }
- if (this.waitForPipes()) {
- return false;
- }
- if (this.mMode == 0) {
- this.mMode = 1;
- }
- if (ConfigHandler.DEHPDirectSteam) {
- if (this.mMode == 1) {
- long steamProduced = this.mTier * 600 * 2L * this.mEfficiency / 10000L;
- long waterConsume = (steamProduced + 160) / 160;
-
- if (this.getWaterFromHatches(false) - waterConsume > 0) {
- this.consumeFluid(FluidRegistry.WATER, waterConsume);
- this.addOutput(GT_ModHandler.getSteam(steamProduced));
- } else {
- this.explodeMultiblock();
- return false;
- }
- } else if (this.mMode == 2) {
- long steamProduced = this.mTier * 300 * 2L * this.mEfficiency / 10000L;
- long waterConsume = (steamProduced + 160) / 160;
-
- if (this.getWaterFromHatches(true) - waterConsume > 0) {
- this.consumeFluid(
- GT_ModHandler.getDistilledWater(1)
- .getFluid(),
- waterConsume);
- this.addOutput(FluidRegistry.getFluidStack("ic2superheatedsteam", (int) steamProduced));
- } else {
- this.explodeMultiblock();
- return false;
- }
- }
- } else if (this.mMode == 1 || this.mMode == 2) {
- long coolantConverted = (long) (this.mTier * 24
- * (double) GT_TileEntity_DEHP.nulearHeatMod
- * this.mEfficiency
- / 10000L);
- if (this.getFluidFromHatches(FluidRegistry.getFluid("ic2coolant")) - coolantConverted > 0) {
- this.consumeFluid(FluidRegistry.getFluid("ic2coolant"), coolantConverted);
- this.addOutput(FluidRegistry.getFluidStack("ic2hotcoolant", (int) coolantConverted));
- } else {
- this.explodeMultiblock();
- return false;
- }
- }
- return true;
- }
-
- private boolean consumeFluid(Fluid fluid, long ammount) {
- if (ammount > Integer.MAX_VALUE) {
- int[] tmp = new int[(int) (ammount / Integer.MAX_VALUE)];
- Arrays.fill(tmp, (int) (ammount / Integer.MAX_VALUE));
- for (int i = 0; i < tmp.length; i++) {
- for (GT_MetaTileEntity_Hatch_Input ih : this.mInputHatches) {
- if (fluid.equals(FluidRegistry.WATER) ? ih.getFluid()
- .getFluid()
- .equals(fluid)
- || ih.getFluid()
- .getFluid()
- .equals(
- GT_ModHandler.getDistilledWater(1)
- .getFluid())
- : ih.getFluid()
- .getFluid()
- .equals(fluid))
- tmp[i] -= ih.drain((int) ammount, true).amount;
- if (tmp[i] <= 0) break;
- }
- }
-
- return tmp[tmp.length - 1] <= 0;
- }
-
- long tmp = ammount;
- for (GT_MetaTileEntity_Hatch_Input ih : this.mInputHatches) {
- if (fluid.equals(FluidRegistry.WATER) ? ih.getFluid()
- .getFluid()
- .equals(fluid)
- || ih.getFluid()
- .getFluid()
- .equals(
- GT_ModHandler.getDistilledWater(1)
- .getFluid())
- : ih.getFluid()
- .getFluid()
- .equals(fluid))
- tmp -= ih.drain((int) ammount, true).amount;
- if (tmp <= 0) return true;
- }
- return false;
- }
-
- @Override
- protected void setElectricityStats() {
- try {
- this.mEUt = this.isPickingPipes ? 60 : Math.toIntExact(GT_Values.V[this.getMinTier()]);
- } catch (ArithmeticException e) {
- e.printStackTrace();
- this.mEUt = Integer.MAX_VALUE - 7;
- }
- this.mProgresstime = 0;
- this.mMaxProgresstime = 1;
- this.mEfficiency = this.getCurrentEfficiency(null);
- this.mEfficiencyIncrease = 10000;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java
deleted file mode 100644
index cb2140d62b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry.BW_BLOCKS;
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.TT;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
-import static gregtech.api.enums.GT_HatchElement.*;
-import static gregtech.api.enums.Textures.BlockIcons.*;
-import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.annotation.Nonnull;
-
-import net.minecraft.block.Block;
-import net.minecraft.client.Minecraft;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ChunkCoordinates;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.jetbrains.annotations.NotNull;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.client.renderer.BW_EICPistonVisualizer;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.net.EICPacket;
-import com.github.bartimaeusnek.bartworks.util.Coords;
-import com.gtnewhorizon.structurelib.StructureLibAPI;
-import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
-import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
-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.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 fox.spiteful.avaritia.blocks.LudicrousBlocks;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.SoundResource;
-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;
-
-public class GT_TileEntity_ElectricImplosionCompressor
- extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_TileEntity_ElectricImplosionCompressor>
- implements ISurvivalConstructable {
-
- private static final boolean pistonEnabled = !ConfigHandler.disablePistonInEIC;
- private Boolean piston = true;
- private static final SoundResource sound = SoundResource.RANDOM_EXPLODE;
- private final ArrayList<ChunkCoordinates> chunkCoordinates = new ArrayList<>(5);
- private int mBlockTier = 0;
- private int mCasing;
-
- public GT_TileEntity_ElectricImplosionCompressor(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_ElectricImplosionCompressor(String aName) {
- super(aName);
- }
-
- private static final int CASING_INDEX = 16;
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_ElectricImplosionCompressor> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_ElectricImplosionCompressor>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] { { "ccc", "cec", "ccc" }, { "ttt", "tft", "ttt" }, { "ttt", "tft", "ttt" },
- { "nnn", "nnn", "nnn" }, { "nNn", "NNN", "nNn" }, { "nnn", "nnn", "nnn" }, { "t~t", "tft", "ttt" },
- { "ttt", "tft", "ttt" }, { "CCC", "CeC", "CCC" }, }))
- .addElement('c', ofChain(ofBlock(GregTech_API.sBlockCasings2, 0), ofBlock(GregTech_API.sBlockCasings3, 4)))
- .addElement('t', ofBlock(BW_BLOCKS[2], 1))
- .addElement('f', ofBlock(BW_BLOCKS[2], 0))
- .addElement(
- 'n',
- StructureUtility.ofBlocksTiered(
- tieredBlockConverter(),
- getAllBlockTiers(),
- 0,
- GT_TileEntity_ElectricImplosionCompressor::setBlockTier,
- GT_TileEntity_ElectricImplosionCompressor::getBlockTier))
- .addElement(
- 'C',
- buildHatchAdder(GT_TileEntity_ElectricImplosionCompressor.class)
- .atLeast(InputBus, OutputBus, Maintenance, InputHatch, OutputHatch)
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(
- onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings2, 0)),
- onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings3, 4))))
- .addElement(
- 'e',
- buildHatchAdder(GT_TileEntity_ElectricImplosionCompressor.class).atLeast(Energy.or(ExoticEnergy))
- .casingIndex(CASING_INDEX)
- .dot(2)
- .buildAndChain(
- onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings2, 0)),
- onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings3, 4))))
- .addElement('N', new IStructureElement<>() {
-
- // Much of this based on StructureUtility.ofBlocksTiered
- private final List<Pair<Block, Integer>> tiers = getAllBlockTiers();
-
- @Override
- public boolean check(GT_TileEntity_ElectricImplosionCompressor te, World world, int x, int y, int z) {
- if (!te.piston && !world.isAirBlock(x, y, z)) return false;
- if (te.piston) {
- Block candidate = world.getBlock(x, y, z);
- int candidateMeta = world.getBlockMetadata(x, y, z);
- return getTierOfBlock(candidate, candidateMeta) != -1;
- }
- return true;
- }
-
- private Pair<Block, Integer> getTier(ItemStack trigger) {
- return this.tiers.get(Math.min(Math.max(trigger.stackSize, 1), this.tiers.size()) - 1);
- }
-
- @Override
- public boolean spawnHint(GT_TileEntity_ElectricImplosionCompressor te, World world, int x, int y, int z,
- ItemStack itemStack) {
- Pair<Block, Integer> tier = this.getTier(itemStack);
- if (te.piston) StructureLibAPI.hintParticle(world, x, y, z, tier.getKey(), tier.getValue());
- return true;
- }
-
- @Override
- public boolean placeBlock(GT_TileEntity_ElectricImplosionCompressor te, World world, int x, int y, int z,
- ItemStack itemStack) {
- Pair<Block, Integer> tier = this.getTier(itemStack);
- if (te.piston) world.setBlock(x, y, z, tier.getKey(), tier.getValue(), 3);
- else world.setBlockToAir(x, y, z);
- return true;
- }
-
- @Override
- public BlocksToPlace getBlocksToPlace(GT_TileEntity_ElectricImplosionCompressor t, World world, int x,
- int y, int z, ItemStack trigger, AutoPlaceEnvironment env) {
- return BlocksToPlace.createEmpty();
- }
-
- @Override
- public PlaceResult survivalPlaceBlock(GT_TileEntity_ElectricImplosionCompressor t, World world, int x,
- int y, int z, ItemStack trigger, AutoPlaceEnvironment env) {
- return isAir().survivalPlaceBlock(t, world, x, y, z, trigger, env);
- }
- })
- .build();
-
- public static List<Pair<Block, Integer>> getAllBlockTiers() {
- return new ArrayList<>() {
-
- private static final long serialVersionUID = 8171991663102417651L;
-
- {
- this.add(Pair.of(GregTech_API.sBlockMetal5, 2));
- this.add(Pair.of(LudicrousBlocks.resource_block, 1));
- this.add(Pair.of(GregTech_API.sBlockMetal9, 4));
- this.add(Pair.of(GregTech_API.sBlockMetal9, 3));
- this.add(Pair.of(GregTech_API.sBlockMetal9, 8));
- }
-
- };
- }
-
- public static ITierConverter<Integer> tieredBlockConverter() {
- return GT_TileEntity_ElectricImplosionCompressor::getTierOfBlock;
- }
-
- private static int getTierOfBlock(Block block, int meta) {
- if (block == null) {
- return -1;
- }
- if (block == GregTech_API.sBlockMetal5 && meta == 2) {
- return 1; // Neutronium
- }
- if (block == LudicrousBlocks.resource_block && meta == 1) {
- return 2; // Infinity
- }
- if (block == GregTech_API.sBlockMetal9) {
- return switch (meta) {
- case 4 -> 3; // Transcendent Metal
- case 3 -> 4; // SpaceTime
- case 8 -> 5; // Universium
- default -> -1;
- };
- }
- return -1;
- }
-
- private void setBlockTier(int tier) {
- this.mBlockTier = tier;
- }
-
- private int getBlockTier() {
- return this.mBlockTier;
- }
-
- @Override
- public IStructureDefinition<GT_TileEntity_ElectricImplosionCompressor> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected IAlignmentLimits getInitialAlignmentLimits() {
- return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && f.isNotFlipped();
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Implosion Compressor")
- .addInfo("Explosions are fun")
- .addInfo("Controller block for the Electric Implosion Compressor")
- .addInfo("Uses electricity instead of Explosives")
- .addInfo("Can parallel up to 4^(Tier - 1)")
- .addInfo("Tier is determined by containment block")
- .addInfo("Valid blocks: Neutronium, Infinity, Transcendent Metal, Spacetime, Universium")
- .addInfo("Minimum allowed energy hatch tier is one below recipe tier")
- .addInfo("Supports " + TT + " energy hatches")
- .addSeparator()
- .beginStructureBlock(3, 9, 3, false)
- .addController("Front 3rd layer center")
- .addCasingInfoMin("Solid Steel Machine Casing", 8, false)
- .addStructureInfo("Casings can be replaced with Explosion Warning Signs")
- .addOtherStructurePart("Transformer-Winding Blocks", "Outer layer 2,3,7,8")
- .addOtherStructurePart("Nickel-Zinc-Ferrite Blocks", "Inner layer 2,3,7,8")
- .addOtherStructurePart("Containment Blocks", "Layer 4,5,6")
- .addMaintenanceHatch("Any bottom casing", 1)
- .addInputBus("Any bottom casing", 1)
- .addInputHatch("Any bottom casing", 1)
- .addOutputBus("Any bottom casing", 1)
- .addEnergyHatch("Bottom middle and/or top middle", 2)
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return BartWorksRecipeMaps.electricImplosionCompressorRecipes;
- }
-
- @Override
- protected ProcessingLogic createProcessingLogic() {
- return new ProcessingLogic() {
-
- @NotNull
- @Override
- protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
- long voltage = GT_TileEntity_ElectricImplosionCompressor.this.getAverageInputVoltage();
- // Only allow a minimum of T-1 energy hatch
- if (recipe.mEUt > voltage * 4) {
- return CheckRecipeResultRegistry.insufficientPower(recipe.mEUt);
- }
- return CheckRecipeResultRegistry.SUCCESSFUL;
- }
-
- @NotNull
- @Override
- protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
- // For overclocking we'll allow all power to be used
- return super.createOverclockCalculator(recipe)
- .setEUt(GT_TileEntity_ElectricImplosionCompressor.this.getMaxInputEu())
- .setAmperage(1);
- }
- }.setMaxParallelSupplier(() -> (int) Math.pow(4, Math.max(this.mBlockTier - 1, 0)));
- }
-
- private void updateChunkCoordinates() {
- this.chunkCoordinates.clear();
-
- for (int x = -1; x <= 1; x++) for (int z = -1; z <= 1; z++) {
- if (Math.abs(x) != 1 || Math.abs(z) != 1) {
- int[] abc = { x, -2, z + 1 };
- int[] xyz = { 0, 0, 0 };
- this.getExtendedFacing()
- .getWorldOffset(abc, xyz);
- xyz[0] += this.getBaseMetaTileEntity()
- .getXCoord();
- xyz[1] += this.getBaseMetaTileEntity()
- .getYCoord();
- xyz[2] += this.getBaseMetaTileEntity()
- .getZCoord();
- this.chunkCoordinates.add(new ChunkCoordinates(xyz[0], xyz[1], xyz[2]));
- }
- }
- }
-
- @Override
- public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
- super.onFirstTick(aBaseMetaTileEntity);
- this.updateChunkCoordinates();
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- super.onPostTick(aBaseMetaTileEntity, aTick);
-
- if (pistonEnabled && aBaseMetaTileEntity.isActive() && aTick % 20 == 0) {
- if (aBaseMetaTileEntity.isClientSide()) this.animatePiston(aBaseMetaTileEntity);
- else if (aBaseMetaTileEntity.hasMufflerUpgrade()) MainMod.BW_Network_instance.sendPacketToAllPlayersInRange(
- aBaseMetaTileEntity.getWorld(),
- new EICPacket(
- new Coords(
- aBaseMetaTileEntity.getXCoord(),
- aBaseMetaTileEntity.getYCoord(),
- aBaseMetaTileEntity.getZCoord()),
- true),
- aBaseMetaTileEntity.getXCoord(),
- aBaseMetaTileEntity.getZCoord());
- }
- }
-
- @Override
- public void setExtendedFacing(ExtendedFacing newExtendedFacing) {
- super.setExtendedFacing(newExtendedFacing); // Will call stopMachine
-
- this.updateChunkCoordinates();
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public void stopMachine() {
- this.resetPiston(this.mBlockTier);
- super.stopMachine();
- }
-
- private void resetPiston(int tier) {
- if (!pistonEnabled) return;
- IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
- if (!aBaseMetaTileEntity.isServerSide()) return;
- if (!this.piston) {
- List<Pair<Block, Integer>> tiers = getAllBlockTiers();
- Pair<Block, Integer> tieredBlock = tiers.get(Math.min(tier, tiers.size()) - 1);
- this.chunkCoordinates.forEach(c -> {
- // Don't replace real blocks in case user has placed something (e.g. tier upgrade)
- if (aBaseMetaTileEntity.getWorld()
- .isAirBlock(c.posX, c.posY, c.posZ)) {
- aBaseMetaTileEntity.getWorld()
- .setBlock(c.posX, c.posY, c.posZ, tieredBlock.getKey(), tieredBlock.getValue(), 3);
- }
- });
- this.piston = !this.piston;
- }
- }
-
- private void activatePiston() {
- if (!pistonEnabled) return;
- IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
- if (!aBaseMetaTileEntity.isServerSide()) return;
- if (this.piston) {
- this.chunkCoordinates.forEach(
- c -> aBaseMetaTileEntity.getWorld()
- .setBlockToAir(c.posX, c.posY, c.posZ));
- this.piston = !this.piston;
- }
- }
-
- private void animatePiston(IGregTechTileEntity aBaseMetaTileEntity) {
- if (!aBaseMetaTileEntity.getWorld().isRemote) return;
-
- if (!this.getBaseMetaTileEntity()
- .hasMufflerUpgrade())
- GT_Utility.doSoundAtClient(
- sound,
- 10,
- 1f,
- 1f,
- this.chunkCoordinates.get(0).posX,
- this.chunkCoordinates.get(0).posY,
- this.chunkCoordinates.get(0).posZ);
- this.spawnVisualPistonBlocks(
- aBaseMetaTileEntity.getWorld(),
- this.chunkCoordinates.get(2).posX,
- this.chunkCoordinates.get(2).posY,
- this.chunkCoordinates.get(2).posZ,
- 10);
- }
-
- @SideOnly(Side.CLIENT)
- private void spawnVisualPistonBlocks(World world, int x, int y, int z, int age) {
- BW_EICPistonVisualizer pistonVisualizer = new BW_EICPistonVisualizer(world, x, y, z, age);
- Minecraft.getMinecraft().effectRenderer.addEffect(pistonVisualizer);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- super.saveNBTData(aNBT);
- aNBT.setBoolean("piston", this.piston);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- if (aNBT.hasKey("piston")) this.piston = aNBT.getBoolean("piston");
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
- int pistonTier = this.mBlockTier;
- this.mCasing = 0;
- int mMaxHatchTier = 0;
- this.setBlockTier(0);
- boolean isOK = this.checkPiece(STRUCTURE_PIECE_MAIN, 1, 6, 0);
-
- List<GT_MetaTileEntity_Hatch> energyHatches = this.getExoticAndNormalEnergyHatchList();
- for (GT_MetaTileEntity_Hatch hatch : energyHatches) {
- mMaxHatchTier = Math.max(mMaxHatchTier, hatch.mTier);
- }
-
- isOK = isOK && this.mMaintenanceHatches.size() == 1 && energyHatches.size() >= 1;
- if (isOK) {
- this.activatePiston();
- return true;
- }
- this.resetPiston(pistonTier);
- return false;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_ElectricImplosionCompressor(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(CASING_INDEX),
- 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), 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.getCasingTextureForId(CASING_INDEX) };
- }
-
- @Override
- public void construct(ItemStack itemStack, boolean b) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 1, 6, 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
- if (this.mMachine) return -1;
- return this.survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 6, 0, elementBudget, env, false, true);
- }
-
- @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, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- return false;
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java
deleted file mode 100644
index a5ed5a69b7..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Copyright (C) 2022 kuba6000 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/>.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_VIA_BARTWORKS;
-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_Values.AuthorKuba;
-import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
-import static gregtech.api.util.GT_Utility.filterValidMTEs;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-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.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.common.items.SimpleSubItemClass;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-
-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.enums.OrePrefixes;
-import gregtech.api.enums.Textures;
-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.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
-import gregtech.api.util.GT_Utility;
-
-public class GT_TileEntity_HTGR extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_TileEntity_HTGR> {
-
- private static final int BASECASINGINDEX = 181;
-
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_HTGR> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_HTGR>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] {
- { " BBBBBBB ", " BBBBBBBBB ", "BBBBBBBBBBB", "BBBBBBBBBBB", "BBBBBBBBBBB", "BBBBBBBBBBB",
- "BBBBBBBBBBB", "BBBBBBBBBBB", "BBBBBBBBBBB", " BBBBBBBBB ", " BBBBBBB " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " bbb~bbb ", " bbbbbbbbb ", "bbbbbbbbbbb", "bbbbbbbbbbb", "bbbbbbbbbbb", "bbbbbbbbbbb",
- "bbbbbbbbbbb", "bbbbbbbbbbb", "bbbbbbbbbbb", " bbbbbbbbb ", " bbbbbbb " }, }))
- .addElement('c', onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings8, 5)))
- .addElement(
- 'b',
- ofChain(
- ofHatchAdder(GT_TileEntity_HTGR::addOutputToMachineList, BASECASINGINDEX, 1),
- ofHatchAdder(GT_TileEntity_HTGR::addMaintenanceToMachineList, BASECASINGINDEX, 1),
- ofHatchAdder(GT_TileEntity_HTGR::addEnergyInputToMachineList, BASECASINGINDEX, 1),
- onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings8, 5))))
- .addElement(
- 'B',
- ofChain(
- ofHatchAdder(GT_TileEntity_HTGR::addInputToMachineList, BASECASINGINDEX, 2),
- onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings8, 5))))
- // ofHatchAdderOptional(GT_TileEntity_HTGR::addInputToMachineList, BASECASINGINDEX, 2,
- // GregTech_API.sBlockCasings8, 5))
- .build();
-
- private static final int HELIUM_NEEDED = 730000;
- public static final int powerUsage = (int) TierEU.RECIPE_LuV;
- private static final int maxcapacity = 720000;
- private static final int mincapacity = maxcapacity / 10;
- private int HeliumSupply;
- private int fueltype = -1, fuelsupply = 0;
- private boolean empty;
- private int emptyticksnodiff = 0;
- private int coolanttaking = 0;
- private int mCasing = 0;
-
- public GT_TileEntity_HTGR(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- private GT_TileEntity_HTGR(String aName) {
- super(aName);
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public IStructureDefinition<GT_TileEntity_HTGR> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Breeder Reactor")
- .addInfo("Controller block for the High Temperature Gas-cooled Reactor (HTGR)")
- .addInfo(AuthorKuba)
- .addInfo("You can clear internal buffer by changing the mode with a screwdriver")
- .addInfo("Needs a constant supply of coolant while running")
- .addInfo("Needs at least 72k Fuel pebbles to start operation (can hold up to 720k pebbles)")
- .addInfo("Consumes up to 2.5% of total Fuel Pellets per Operation depending on efficiency")
- .addInfo("Efficiency is calculated exponentially depending on the amount of pebbles in the internal buffer")
- .addInfo("and affects total recipe time (at 100% eff, -50% total recipe time")
- .addInfo(
- "Reactor will take 4 000L/s of coolant multiplied by efficiency and by fuel coolant value (check tooltips)")
- .addInfo("Uses " + GT_Utility.formatNumbers(powerUsage) + " EU/t")
- .addInfo("One Operation takes 1 hour")
- .addSeparator()
- .beginStructureBlock(11, 12, 11, true)
- .addController("Front bottom center")
- .addCasingInfoMin("Europium Reinforced Radiation Proof Casings", 500, false)
- .addStructureInfo("Corners and the 2 touching blocks are air (cylindric)")
- .addInputBus("Any top layer casing", 2)
- .addInputHatch("Any top layer casing", 2)
- .addOutputBus("Any bottom layer casing", 1)
- .addOutputHatch("Any bottom layer casing", 1)
- .addEnergyHatch("Any bottom layer casing", 1)
- .addMaintenanceHatch("Any bottom layer casing", 1)
- .toolTipFinisher(MULTIBLOCK_ADDED_VIA_BARTWORKS.apply(ChatColorHelper.GOLD + "kuba6000"));
- return tt;
- }
-
- @Override
- protected IAlignmentLimits getInitialAlignmentLimits() {
- return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && f.isNotFlipped();
- }
-
- @Override
- public void construct(ItemStack stackSize, boolean hintsOnly) {
- this.buildPiece("main", stackSize, hintsOnly, 5, 11, 0);
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
- this.mCasing = 0;
- return this.checkPiece("main", 5, 11, 0) && this.mCasing >= 500
- && this.mMaintenanceHatches.size() == 1
- && this.mInputHatches.size() > 0
- && this.mOutputHatches.size() > 0
- && this.mInputBusses.size() > 0
- && this.mOutputBusses.size() > 0
- && this.mEnergyHatches.size() > 0;
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- this.HeliumSupply = aNBT.getInteger("HeliumSupply");
- this.fueltype = aNBT.getInteger("fueltype");
- this.fuelsupply = aNBT.getInteger("fuelsupply");
- this.empty = aNBT.getBoolean("EmptyMode");
- this.coolanttaking = aNBT.getInteger("coolanttaking");
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- super.saveNBTData(aNBT);
- aNBT.setInteger("HeliumSupply", this.HeliumSupply);
- aNBT.setInteger("fueltype", this.fueltype);
- aNBT.setInteger("fuelsupply", this.fuelsupply);
- aNBT.setBoolean("EmptyMode", this.empty);
- aNBT.setInteger("coolanttaking", this.coolanttaking);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- super.onPostTick(aBaseMetaTileEntity, aTick);
- if (aBaseMetaTileEntity.isServerSide() && !this.empty) {
- boolean updateneeded = false;
- if (this.HeliumSupply < GT_TileEntity_HTGR.HELIUM_NEEDED) {
- for (FluidStack fluidStack : this.getStoredFluids()) {
- if (fluidStack.isFluidEqual(Materials.Helium.getGas(1))) {
- int toget = Math.min(GT_TileEntity_HTGR.HELIUM_NEEDED - this.HeliumSupply, fluidStack.amount);
- fluidStack.amount -= toget;
- this.HeliumSupply += toget;
- updateneeded = true;
- }
- }
- }
- if (this.fuelsupply < maxcapacity) {
- this.startRecipeProcessing();
- for (ItemStack itemStack : this.getStoredInputs()) {
- int type = -1;
- if (itemStack == null || itemStack.getItem() != HTGRMaterials.aHTGR_Materials) continue;
- int damage = HTGRMaterials.aHTGR_Materials.getDamage(itemStack);
- if ((damage + 1) % HTGRMaterials.MATERIALS_PER_FUEL != HTGRMaterials.USABLE_FUEL_INDEX + 1)
- continue; // is fuel
- type = damage / HTGRMaterials.MATERIALS_PER_FUEL;
- if (this.fueltype == -1) this.fueltype = type;
- if (this.fueltype != type) continue;
- int toget = Math.min(maxcapacity - this.fuelsupply, itemStack.stackSize);
- this.fuelsupply += toget;
- itemStack.stackSize -= toget;
- updateneeded = true;
- }
- this.endRecipeProcessing();
- }
- if (updateneeded) this.updateSlots();
- }
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- // Only for visual
- return BartWorksRecipeMaps.htgrFakeRecipes;
- }
-
- @Override
- protected boolean filtersFluid() {
- return false;
- }
-
- @Override
- public boolean checkRecipe(ItemStack controllerStack) {
-
- if (this.empty) {
- if (this.HeliumSupply > 0 || this.fuelsupply > 0) {
- this.mEfficiency = 10000;
- this.mMaxProgresstime = 100;
- return true;
- }
- return false;
- }
- if (this.HeliumSupply < GT_TileEntity_HTGR.HELIUM_NEEDED || this.fuelsupply < mincapacity) return false;
-
- double eff = Math.min(Math.pow((double) this.fuelsupply / (double) mincapacity, 2D), 100D) / 100D
- - (this.getIdealStatus() - this.getRepairStatus()) / 10D;
-
- if (eff <= 0) return false;
-
- int toReduce = MathUtils.floorInt(this.fuelsupply * 0.025D * eff);
-
- final int originalToReduce = toReduce;
- int burnedballs = toReduce / 64;
- if (burnedballs > 0) toReduce -= burnedballs * 64;
-
- int meta = this.fueltype * HTGRMaterials.MATERIALS_PER_FUEL + HTGRMaterials.BURNED_OUT_FUEL_INDEX;
-
- ItemStack[] toOutput = { new ItemStack(HTGRMaterials.aHTGR_Materials, burnedballs, meta),
- new ItemStack(HTGRMaterials.aHTGR_Materials, toReduce, meta + 1) };
- if (!this.canOutputAll(toOutput)) return false;
-
- this.fuelsupply -= originalToReduce;
- this.mOutputItems = toOutput;
-
- // this.updateSlots(); // not needed ?
-
- this.coolanttaking = (int) (4000D * (this.fueltype * 0.5D + 1) * eff);
-
- this.mEfficiency = (int) (eff * 10000D);
- this.mEfficiencyIncrease = 0;
- this.mEUt = -powerUsage;
- this.mMaxProgresstime = (int) (72000 * (1d - eff / 2d));
- return true;
- }
-
- private int runningtick = 0;
-
- @Override
- public boolean onRunningTick(ItemStack aStack) {
- this.runningtick++;
-
- if (this.empty) {
- if (this.emptyticksnodiff > 20 && this.emptyticksnodiff % 20 != 0) {
- this.emptyticksnodiff++;
- return true;
- }
- if (this.HeliumSupply > 0) {
- this.addOutput(Materials.Helium.getGas(this.HeliumSupply));
- this.HeliumSupply = 0;
- }
- if (this.fuelsupply > 0) {
- ItemStack iStack = new ItemStack(
- HTGRMaterials.aHTGR_Materials,
- this.fuelsupply,
- HTGRMaterials.MATERIALS_PER_FUEL * this.fueltype + HTGRMaterials.USABLE_FUEL_INDEX);
- boolean storedAll = false;
- for (GT_MetaTileEntity_Hatch_OutputBus tHatch : filterValidMTEs(mOutputBusses)) {
- if (tHatch.storeAll(iStack)) {
- storedAll = true;
- break;
- }
- }
- if (!storedAll) {
- if (this.fuelsupply == iStack.stackSize) this.emptyticksnodiff++;
- else {
- this.fuelsupply = iStack.stackSize;
- this.emptyticksnodiff = 0;
- }
- } else {
- this.fuelsupply = 0;
- this.fueltype = -1;
- this.coolanttaking = 0;
- }
- }
- return true;
- }
- // USE DA POWAH
- if (!this.drainEnergyInput(-this.mEUt)) {
- this.criticalStopMachine();
- return false;
- }
-
- if (this.runningtick % 20 == 0) {
- int takecoolant = this.coolanttaking;
- int drainedamount = 0;
-
- for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
- FluidStack tLiquid = tHatch.getFluid();
- if (tLiquid != null && tLiquid.isFluidEqual(FluidRegistry.getFluidStack("ic2coolant", 1))) {
- FluidStack drained = tHatch.drain(takecoolant, true);
- takecoolant -= drained.amount;
- drainedamount += drained.amount;
- if (takecoolant <= 0) break;
- }
- }
-
- if (drainedamount > 0) this.addOutput(FluidRegistry.getFluidStack("ic2hotcoolant", drainedamount));
-
- this.updateSlots();
-
- if (takecoolant > 0) this.stopMachine();
- }
-
- return true;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_HTGR(this.mName);
- }
-
- @Override
- public String[] getInfoData() {
- return new String[] { "Mode:", this.empty ? "Emptying" : "Normal", "Progress:",
- GT_Utility.formatNumbers(this.mProgresstime / 20) + "s / "
- + GT_Utility.formatNumbers(this.mMaxProgresstime / 20)
- + "s",
- "Fuel type:",
- this.fueltype == -1 ? "NONE" : "TRISO (" + HTGRMaterials.sHTGR_Fuel[this.fueltype].sEnglish + ")",
- "Fuel amount:", GT_Utility.formatNumbers(this.fuelsupply) + " pcs.", "Helium-Level:",
- GT_Utility.formatNumbers(this.HeliumSupply) + "L / "
- + GT_Utility.formatNumbers(GT_TileEntity_HTGR.HELIUM_NEEDED)
- + "L",
- "Coolant:", GT_Utility.formatNumbers(this.coolanttaking) + "L/s", "Problems:",
- String.valueOf(this.getIdealStatus() - this.getRepairStatus()) };
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side,
- ForgeDirection forgeDirection, int aColorIndex, boolean aActive, boolean aRedstone) {
- if (side == forgeDirection) {
- if (aActive) return new ITexture[] {
- Textures.BlockIcons.getCasingTextureForId(GT_TileEntity_HTGR.BASECASINGINDEX), TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE)
- .extFacing()
- .build(),
- TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW)
- .extFacing()
- .glow()
- .build() };
- return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(GT_TileEntity_HTGR.BASECASINGINDEX),
- TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER)
- .extFacing()
- .build(),
- TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_GLOW)
- .extFacing()
- .glow()
- .build() };
- }
- return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(GT_TileEntity_HTGR.BASECASINGINDEX) };
- }
-
- @Override
- public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- if (this.mMaxProgresstime > 0) {
- GT_Utility.sendChatToPlayer(aPlayer, "HTGR mode cannot be changed while the machine is running.");
- return;
- }
- this.empty = !this.empty;
- GT_Utility.sendChatToPlayer(
- aPlayer,
- "HTGR is now running in " + (this.empty ? "emptying mode." : "normal Operation"));
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-
- public static class HTGRMaterials {
-
- private static class CustomHTGRSimpleSubItemClass extends SimpleSubItemClass {
-
- HashMap<Integer, String> tooltip = null;
-
- public CustomHTGRSimpleSubItemClass(HashMap<Integer, String> tooltip, String... tex) {
- super(tex);
- this.tooltip = tooltip;
- }
-
- @Override
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
- if (this.tooltip.containsKey(this.getDamage(p_77624_1_)))
- aList.add(this.tooltip.get(this.getDamage(p_77624_1_)));
- aList.add("Material for High Temperature Gas-cooled Reactor");
- super.addInformation(p_77624_1_, p_77624_2_, aList, p_77624_4_);
- }
- }
-
- private static class Base_ {
-
- public String sName;
- public String sEnglish;
-
- public Base_(String a, String b) {
- this.sName = a;
- this.sEnglish = b;
- }
- }
-
- public static class Fuel_ {
-
- public String sName;
- public String sEnglish;
- public ItemStack mainItem;
- public ItemStack secondaryItem;
- public ItemStack[] recycledItems = { GT_Values.NI, GT_Values.NI, GT_Values.NI, GT_Values.NI, GT_Values.NI,
- GT_Values.NI };
- public FluidStack recycledFluid;
- public int[] recycleChances;
- public String tooltip;
-
- public Fuel_(String sName, String sEnglish, ItemStack mainItem, ItemStack secondaryItem,
- FluidStack recycledFluid, ItemStack[] recycledItems, int[] recycleChances, String tooltip) {
- this.sName = sName;
- this.sEnglish = sEnglish;
- this.mainItem = mainItem;
- this.secondaryItem = secondaryItem;
- this.recycledFluid = recycledFluid;
- System.arraycopy(recycledItems, 0, this.recycledItems, 0, recycledItems.length);
- this.recycleChances = recycleChances;
- this.tooltip = tooltip;
- }
- }
-
- private static class LangEntry_ {
-
- public String sName;
- public String sEnglish;
-
- public LangEntry_(String a, String b) {
- this.sName = a;
- this.sEnglish = b;
- }
- }
-
- public static final Base_[] sHTGR_Bases = { new Base_("HTGRFuelMixture", "HTGR fuel mixture"),
- new Base_("BISOPebbleCompound", "BISO pebble compound"),
- new Base_("TRISOPebbleCompound", "TRISO pebble compound"), new Base_("TRISOBall", "TRISO ball"),
- new Base_("TRISOPebble", "TRISO pebble"), new Base_("BurnedOutTRISOBall", "Burned out TRISO Ball"),
- new Base_("BurnedOutTRISOPebble", "Burned out TRISO Pebble"), };
- public static final int MATERIALS_PER_FUEL = sHTGR_Bases.length;
- static final int USABLE_FUEL_INDEX = 4;
- static final int BURNED_OUT_FUEL_INDEX = 5;
- public static final Fuel_[] sHTGR_Fuel = { new Fuel_(
- "Thorium",
- "Thorium",
- WerkstoffLoader.Thorium232.get(OrePrefixes.dust, 64),
- Materials.Uranium235.getDust(4),
- GT_Values.NF,
- new ItemStack[] { Materials.Silicon.getDust(1), Materials.Graphite.getDust(1), Materials.Carbon.getDust(1),
- Materials.Lutetium.getDust(1), WerkstoffLoader.Thorium232.get(OrePrefixes.dust, 1) },
- new int[] { 9900 / 4, 9900 / 4, 9900 / 4, 9900 / 4, 162 / 4 },
- "Multiplies coolant by 1"),
- new Fuel_(
- "Uranium",
- "Uranium",
- Materials.Uranium.getDust(64),
- Materials.Uranium235.getDust(8),
- FluidRegistry.getFluidStack("krypton", 4),
- new ItemStack[] { Materials.Silicon.getDust(1), Materials.Graphite.getDust(1),
- Materials.Carbon.getDust(1), Materials.Lead.getDust(1), Materials.Uranium.getDust(1) },
- new int[] { 9900 / 4, 9900 / 4, 9900 / 4, 5000 / 4, 5000 / 4 },
- "Multiplies coolant by 1.5"),
- new Fuel_(
- "Plutonium",
- "Plutonium",
- Materials.Plutonium.getDust(64),
- Materials.Plutonium241.getDust(4),
- FluidRegistry.getFluidStack("xenon", 4),
- new ItemStack[] { Materials.Silicon.getDust(1), Materials.Graphite.getDust(1),
- Materials.Carbon.getDust(1), Materials.Lead.getDust(1), Materials.Plutonium.getDust(1) },
- new int[] { 9900 / 4, 9900 / 4, 9900 / 4, 5000 / 4, 5000 / 4 },
- "Multiplies coolant by 2"), };
- public static final CustomHTGRSimpleSubItemClass aHTGR_Materials;
- static final ArrayList<LangEntry_> aHTGR_Localizations = new ArrayList<>();
-
- static {
- String[] sHTGR_Materials = new String[sHTGR_Bases.length * sHTGR_Fuel.length];
- HashMap<Integer, String> tooltip = new HashMap<>();
- int i = 0;
- for (Fuel_ fuel : sHTGR_Fuel) for (Base_ base : sHTGR_Bases) {
- sHTGR_Materials[i] = "HTGR" + base.sName + fuel.sName;
- aHTGR_Localizations.add(
- new LangEntry_("item." + sHTGR_Materials[i] + ".name", base.sEnglish + " (" + fuel.sEnglish + ")"));
- if ((i + 1) % MATERIALS_PER_FUEL == USABLE_FUEL_INDEX + 1 && fuel.tooltip != null
- && !fuel.tooltip.isEmpty()) tooltip.put(i, fuel.tooltip);
- i++;
- }
- aHTGR_Materials = new CustomHTGRSimpleSubItemClass(tooltip, sHTGR_Materials);
- }
-
- public static void registeraTHR_Materials() {
- for (LangEntry_ iName : aHTGR_Localizations)
- GT_LanguageManager.addStringLocalization(iName.sName, iName.sEnglish);
- GameRegistry.registerItem(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, "bw.HTGRMaterials");
- }
-
- public static void register_fake_THR_Recipes() {
-
- int i = 0;
- for (@SuppressWarnings("unused")
- Fuel_ fuel : sHTGR_Fuel) {
-
- BartWorksRecipeMaps.htgrFakeRecipes.addFakeRecipe(
- false,
- new ItemStack[] { new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 64, i + 4) },
- new ItemStack[] { new ItemStack(GT_TileEntity_HTGR.HTGRMaterials.aHTGR_Materials, 1, i + 5) },
- null,
- null,
- null,
- 72000,
- powerUsage,
- 0);
-
- i += MATERIALS_PER_FUEL;
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java
deleted file mode 100644
index 5a2c3ba382..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import java.awt.Color;
-import java.util.ArrayList;
-import java.util.Collections;
-
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-import com.github.bartimaeusnek.bartworks.util.ConnectedBlocksChecker;
-import com.gtnewhorizons.modularui.api.NumberFormatMUI;
-import com.gtnewhorizons.modularui.api.drawable.Text;
-import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
-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.DynamicPositionedColumn;
-import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
-import com.gtnewhorizons.modularui.common.widget.ProgressBar;
-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 cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
-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_MultiBlockBase;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_Utility;
-
-public class GT_TileEntity_LESU extends GT_MetaTileEntity_MultiBlockBase {
-
- private static final byte TEXID_SIDE = 0;
- private static final byte TEXID_CHARGING = 1;
- private static final byte TEXID_IDLE = 2;
- private static final byte TEXID_EMPTY = 3;
- private static final IIcon[] iIcons = new IIcon[4];
- private static final IIconContainer[] iIconContainers = new IIconContainer[4];
- private static final ITexture[][] iTextures = new ITexture[4][1];
- public ConnectedBlocksChecker connectedcells;
- public final ItemStack[] circuits = new ItemStack[5];
- private final ItemStackHandler circuitsInventoryHandler = new ItemStackHandler(this.circuits) {
-
- @Override
- public int getSlotLimit(int slot) {
- return 1;
- }
- };
- private long mStorage;
-
- protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
-
- public GT_TileEntity_LESU(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- this.mStorage = ConfigHandler.energyPerCell;
- }
-
- public GT_TileEntity_LESU(String aName) {
- super(aName);
- }
-
- @Override
- public boolean isEnetOutput() {
- return true;
- }
-
- @Override
- public boolean isEnetInput() {
- return true;
- }
-
- @Override
- public long maxEUStore() {
- return this.mStorage >= Long.MAX_VALUE - 1 || this.mStorage < 0 ? Long.MAX_VALUE - 1 : this.mStorage;
- }
-
- @Override
- public long maxAmperesIn() {
- int ret = 0;
- for (int i = 0; i < 5; ++i) if (this.circuits[i] != null && this.circuits[i].getItem()
- .equals(
- GT_Utility.getIntegratedCircuit(0)
- .getItem()))
- ret += this.circuits[i].getItemDamage();
- return ret > 0 ? ret : 1;
- }
-
- @Override
- public long maxAmperesOut() {
- return this.maxAmperesIn();
- }
-
- @Override
- public long maxEUInput() {
-
- for (int i = 1; i < GT_Values.V.length; i++) {
- if (this.maxEUOutput() <= GT_Values.V[i] && this.maxEUOutput() > GT_Values.V[i - 1])
- return Math.min(GT_Values.V[i], 32768L);
- }
-
- return 8;
- }
-
- @Override
- public long maxEUOutput() {
- return Math.min(Math.max(this.mStorage / ConfigHandler.energyPerCell, 1L), 32768L);
- }
-
- @Override
- public int rechargerSlotStartIndex() {
- return 0;
- }
-
- @Override
- public int rechargerSlotCount() {
- return 1;
- }
-
- @Override
- public int dechargerSlotStartIndex() {
- return 1;
- }
-
- @Override
- public int dechargerSlotCount() {
- return 1;
- }
-
- @Override
- public boolean isTeleporterCompatible() {
- return true;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_LESU(this.mName);
- }
-
- @Override
- public String[] getDescription() {
- ArrayList<String> e = new ArrayList<>();
- String[] dsc = StatCollector.translateToLocal("tooltip.tile.lesu.0.name")
- .split(";");
- Collections.addAll(e, dsc);
- e.add(
- StatCollector.translateToLocal("tooltip.tile.lesu.1.name") + " "
- + GT_Utility.formatNumbers(ConfigHandler.energyPerCell)
- + "EU");
- dsc = StatCollector.translateToLocal("tooltip.tile.lesu.2.name")
- .split(";");
- Collections.addAll(e, dsc);
- e.add(ChatColorHelper.RED + StatCollector.translateToLocal("tooltip.tile.lesu.3.name"));
- e.add(BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get());
- return e.toArray(new String[0]);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void registerIcons(IIconRegister aBlockIconRegister) {
-
- for (int i = 0; i < GT_TileEntity_LESU.iTextures.length; i++) {
- GT_TileEntity_LESU.iIcons[i] = aBlockIconRegister.registerIcon(MainMod.MOD_ID + ":LESU_CASING_" + i);
- int finalI = i;
- GT_TileEntity_LESU.iIconContainers[i] = new IIconContainer() {
-
- @Override
- public IIcon getIcon() {
- return GT_TileEntity_LESU.iIcons[finalI];
- }
-
- @Override
- public IIcon getOverlayIcon() {
- return GT_TileEntity_LESU.iIcons[finalI];
- }
-
- @Override
- public ResourceLocation getTextureFile() {
- return new ResourceLocation(MainMod.MOD_ID + ":LESU_CASING_" + finalI);
- }
- };
- }
- }
-
- public boolean isClientSide() {
- if (this.getWorld() != null) return this.getWorld().isRemote ? FMLCommonHandler.instance()
- .getSide() == Side.CLIENT
- : FMLCommonHandler.instance()
- .getEffectiveSide() == Side.CLIENT;
- return FMLCommonHandler.instance()
- .getEffectiveSide() == Side.CLIENT;
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
- int aColorIndex, boolean aActive, boolean aRedstone) {
-
- ITexture[] ret = {};
-
- if (this.isClientSide()) {
-
- for (int i = 0; i < GT_TileEntity_LESU.iTextures.length; i++) {
- GT_TileEntity_LESU.iTextures[i][0] = TextureFactory
- .of(GT_TileEntity_LESU.iIconContainers[i], Dyes.getModulation(0, Dyes.MACHINE_METAL.mRGBa));
- }
-
- if (side == facing && this.getBaseMetaTileEntity()
- .getUniversalEnergyStored() <= 0) ret = GT_TileEntity_LESU.iTextures[GT_TileEntity_LESU.TEXID_EMPTY];
- else if (side == facing && !aActive) ret = GT_TileEntity_LESU.iTextures[GT_TileEntity_LESU.TEXID_IDLE];
- else if (side == facing && aActive) ret = GT_TileEntity_LESU.iTextures[GT_TileEntity_LESU.TEXID_CHARGING];
- else ret = GT_TileEntity_LESU.iTextures[GT_TileEntity_LESU.TEXID_SIDE];
- }
-
- return ret;
- }
-
- @Override
- public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) {
- return true;
- }
-
- @Override
- public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) {
- return true;
- }
-
- @Override
- public int getSizeInventory() {
- return 6;
- }
-
- @Override
- public ItemStack getStackInSlot(int slotIn) {
- if (slotIn > 1) return this.circuits[slotIn - 2];
- return this.mInventory[slotIn];
- }
-
- @Override
- public void setInventorySlotContents(int index, ItemStack stack) {
- if (index < 2) this.mInventory[index] = stack;
- else this.circuits[index - 2] = stack;
- }
-
- @Override
- public String getInventoryName() {
- return "L.E.S.U.";
- }
-
- @Override
- public boolean hasCustomInventoryName() {
- return true;
- }
-
- @Override
- public int getInventoryStackLimit() {
- return 1;
- }
-
- @Override
- public boolean isUseableByPlayer(EntityPlayer player) {
- return true;
- }
-
- @Override
- public boolean isItemValidForSlot(int index, ItemStack stack) {
-
- return switch (index) {
- case 0, 1 -> true;
- default -> stack != null && stack.getItem()
- .equals(
- GT_Utility.getIntegratedCircuit(0)
- .getItem());
- };
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public boolean checkRecipe(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public boolean isInputFacing(ForgeDirection side) {
- return side != this.getBaseMetaTileEntity()
- .getFrontFacing();
- }
-
- @Override
- public boolean isOutputFacing(ForgeDirection side) {
- return side == this.getBaseMetaTileEntity()
- .getFrontFacing();
- }
-
- @Override
- public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
- this.checkMachine(aBaseMetaTileEntity, null);
- super.onFirstTick(aBaseMetaTileEntity);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (aBaseMetaTileEntity.isServerSide()) {
- this.mMaxProgresstime = 1;
- if (aTick % 20 == 0) this.checkMachine(aBaseMetaTileEntity, null);
- this.mWrench = true;
- this.mScrewdriver = true;
- this.mSoftHammer = true;
- this.mHardHammer = true;
- this.mSolderingTool = true;
- this.mCrowbar = true;
- }
- }
-
- @Override
- public long getMinimumStoredEU() {
- return 0;
- }
-
- @Override
- public boolean onRunningTick(ItemStack aStack) {
- this.mMaxProgresstime = 1;
- return true;
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- aNBT.setIntArray("customCircuitInv", GT_Utility.stacksToIntArray(this.circuits));
- super.saveNBTData(aNBT);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- int[] stacks = aNBT.getIntArray("customCircuitInv");
- for (int i = 0; i < stacks.length; i++) {
- this.circuits[i] = GT_Utility.intToStack(stacks[i]);
- }
- super.loadNBTData(aNBT);
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
- long startingTime = System.nanoTime();
- this.connectedcells = new ConnectedBlocksChecker();
- this.connectedcells.get_connected(
- aBaseMetaTileEntity.getWorld(),
- aBaseMetaTileEntity.getXCoord(),
- aBaseMetaTileEntity.getYCoord(),
- aBaseMetaTileEntity.getZCoord(),
- ItemRegistry.BW_BLOCKS[1]);
-
- if (this.connectedcells.get_meta_of_sideblocks(
- aBaseMetaTileEntity.getWorld(),
- this.getBaseMetaTileEntity()
- .getMetaTileID(),
- new int[] { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(),
- aBaseMetaTileEntity.getZCoord() },
- true)) {
- this.getBaseMetaTileEntity()
- .disableWorking();
- this.getBaseMetaTileEntity()
- .setActive(false);
- this.mStorage = 0;
- this.mMaxProgresstime = 0;
- this.mProgresstime = 0;
- return false;
- }
-
- this.mEfficiency = this.getMaxEfficiency(null);
- this.mStorage = ConfigHandler.energyPerCell * this.connectedcells.hashset.size() >= Long.MAX_VALUE - 1
- || ConfigHandler.energyPerCell * this.connectedcells.hashset.size() < 0 ? Long.MAX_VALUE - 1
- : ConfigHandler.energyPerCell * this.connectedcells.hashset.size();
- this.mMaxProgresstime = 1;
- this.mProgresstime = 0;
-
- this.mCrowbar = true;
- this.mHardHammer = true;
- this.mScrewdriver = true;
- this.mSoftHammer = true;
- this.mSolderingTool = true;
- this.mWrench = true;
-
- this.getBaseMetaTileEntity()
- .enableWorking();
- this.getBaseMetaTileEntity()
- .setActive(true);
-
- long finishedTime = System.nanoTime();
- // System.out.println("LESU LookUp: "+((finishedTime - startingTime) / 1000000)+"ms");
- if (finishedTime - startingTime > 5000000) MainMod.LOGGER.warn(
- "LESU LookUp took longer than 5ms!(" + (finishedTime - startingTime)
- + "ns / "
- + (finishedTime - startingTime) / 1000000
- + "ms) Owner:"
- + this.getBaseMetaTileEntity()
- .getOwnerName()
- + " Check at x:"
- + this.getBaseMetaTileEntity()
- .getXCoord()
- + " y:"
- + this.getBaseMetaTileEntity()
- .getYCoord()
- + " z:"
- + this.getBaseMetaTileEntity()
- .getZCoord()
- + " DIM-ID: "
- + this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId);
- return true;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- public World getWorld() {
- return this.getBaseMetaTileEntity()
- .getWorld();
- }
-
- @Override
- public void addGregTechLogo(ModularWindow.Builder builder) {
- builder.widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY)
- .setSize(17, 17)
- .setPos(105, 51));
- }
-
- @Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- builder.widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
- .setPos(7, 4)
- .setSize(118, 67))
- .widget(new SlotWidget(new BaseSlot(this.inventoryHandler, 1) {
-
- @Override
- public int getSlotStackLimit() {
- return 1;
- }
- }).setBackground(
- this.getGUITextureSet()
- .getItemSlot(),
- GT_UITextures.OVERLAY_SLOT_IN)
- .setPos(127, 13))
- .widget(new SlotWidget(new BaseSlot(this.inventoryHandler, 0) {
-
- @Override
- public int getSlotStackLimit() {
- return 1;
- }
- }).setBackground(
- this.getGUITextureSet()
- .getItemSlot(),
- GT_UITextures.OVERLAY_SLOT_CHARGER)
- .setPos(127, 49));
- for (int i = 0; i < 4; i++) {
- builder.widget(
- new SlotWidget(this.circuitsInventoryHandler, i).setBackground(
- this.getGUITextureSet()
- .getItemSlot(),
- GT_UITextures.OVERLAY_SLOT_INT_CIRCUIT)
- .setPos(151, 4 + i * 18));
- }
-
- final DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
- this.drawTexts(screenElements);
- builder.widget(screenElements);
-
- builder.widget(
- new DrawableWidget().setDrawable(BW_UITextures.PICTURE_STORED_EU_FRAME)
- .setPos(7, 72)
- .setSize(118, 7))
- .widget(
- new ProgressBar().setProgress(
- () -> (float) this.getBaseMetaTileEntity()
- .getStoredEU() / this.getBaseMetaTileEntity()
- .getEUCapacity())
- .setDirection(ProgressBar.Direction.RIGHT)
- .setTexture(BW_UITextures.PROGRESSBAR_STORED_EU_116, 116)
- .setPos(8, 73)
- .setSize(116, 5));
- }
-
- private long clientEU;
- private long clientMaxEU;
- private long clientMaxIn;
- private long clientMaxOut;
- private long clientAmps;
-
- private void drawTexts(DynamicPositionedColumn screenElements) {
- screenElements.setSpace(0)
- .setPos(11, 8);
-
- screenElements.widget(
- new TextWidget().setStringSupplier(() -> "EU: " + numberFormat.format(this.clientEU))
- .setDefaultColor(this.COLOR_TEXT_WHITE.get()))
- .widget(
- new FakeSyncWidget.LongSyncer(
- () -> this.getBaseMetaTileEntity()
- .getStoredEU(),
- val -> clientEU = val))
- .widget(
- new TextWidget().setStringSupplier(() -> "MAX: " + numberFormat.format(clientMaxEU))
- .setDefaultColor(this.COLOR_TEXT_WHITE.get()))
- .widget(
- new FakeSyncWidget.LongSyncer(
- () -> this.getBaseMetaTileEntity()
- .isActive()
- ? this.getBaseMetaTileEntity()
- .getOutputVoltage() * ConfigHandler.energyPerCell
- : 0,
- val -> clientMaxEU = val))
- .widget(
- new TextWidget().setStringSupplier(() -> "MAX EU/t IN: " + numberFormat.format(clientMaxIn))
- .setDefaultColor(this.COLOR_TEXT_WHITE.get()))
- .widget(
- new FakeSyncWidget.LongSyncer(
- () -> this.getBaseMetaTileEntity()
- .getInputVoltage(),
- val -> clientMaxIn = val))
- .widget(
- new TextWidget().setStringSupplier(() -> "EU/t OUT: " + numberFormat.format(clientMaxOut))
- .setDefaultColor(this.COLOR_TEXT_WHITE.get()))
- .widget(
- new FakeSyncWidget.LongSyncer(
- () -> this.getBaseMetaTileEntity()
- .getOutputVoltage(),
- val -> clientMaxOut = val))
- .widget(
- new TextWidget().setStringSupplier(() -> "AMP/t IN/OUT: " + numberFormat.format(clientAmps))
- .setDefaultColor(this.COLOR_TEXT_WHITE.get()))
- .widget(
- new FakeSyncWidget.LongSyncer(
- () -> this.getBaseMetaTileEntity()
- .getInputAmperage(),
- val -> clientAmps = val))
- .widget(
- new TextWidget(Text.localised("tooltip.LESU.0.name")).setDefaultColor(Color.YELLOW.getRGB())
- .setEnabled(widget -> this.maxEUStore() >= Long.MAX_VALUE - 1))
- .widget(
- new TextWidget(Text.localised("tooltip.LESU.1.name")).setDefaultColor(Color.RED.getRGB())
- .setEnabled(
- widget -> !this.getBaseMetaTileEntity()
- .isActive()));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java
deleted file mode 100644
index b481429411..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry.BW_BLOCKS;
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-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_Values.V;
-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.util.GT_StructureUtility.ofHatchAdder;
-import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional;
-
-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 com.gtnewhorizon.structurelib.StructureLibAPI;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-
-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.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
-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_TieredMachineBlock;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
-import gregtech.api.util.GT_Utility;
-
-public class GT_TileEntity_ManualTrafo extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_TileEntity_ManualTrafo> {
-
- private byte mode;
- private int mTiers;
- private boolean upstep = true;
-
- public GT_TileEntity_ManualTrafo(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_ManualTrafo(String aName) {
- super(aName);
- }
-
- private static final int CASING_INDEX = 2;
- private static final String STRUCTURE_PIECE_BASE = "base";
- private static final String STRUCTURE_PIECE_LAYER = "layer";
- private static final String STRUCTURE_PIECE_TOP = "top";
- private static final String STRUCTURE_PIECE_TAP_LAYER = "taplayer";
- private static final IStructureDefinition<GT_TileEntity_ManualTrafo> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_ManualTrafo>builder()
- .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" } }))
- .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "ttt", "tft", "ttt" } }))
- .addShape(STRUCTURE_PIECE_TOP, transpose(new String[][] { { "ooo", "ooo", "ooo" } }))
- .addShape(
- STRUCTURE_PIECE_TAP_LAYER,
- transpose(new String[][] { { " TTT ", "TtttT", "TtftT", "TtttT", " TTT " } }))
- .addElement(
- 'b',
- ofChain(
- ofHatchAdder(GT_TileEntity_ManualTrafo::addEnergyInputToMachineList, CASING_INDEX, 1),
- ofHatchAdder(GT_TileEntity_ManualTrafo::addMaintenanceToMachineList, CASING_INDEX, 1),
- ofBlock(GregTech_API.sBlockCasings1, 2)))
- .addElement(
- 'o',
- ofHatchAdderOptional(
- GT_TileEntity_ManualTrafo::addDynamoToMachineList,
- CASING_INDEX,
- 2,
- GregTech_API.sBlockCasings1,
- 2))
- .addElement('t', ofBlock(BW_BLOCKS[2], 1))
- .addElement('f', ofBlock(BW_BLOCKS[2], 0))
- .addElement('T', new IStructureElementNoPlacement<GT_TileEntity_ManualTrafo>() {
-
- @Override
- public boolean check(GT_TileEntity_ManualTrafo te, World world, int x, int y, int z) {
- if (world.isAirBlock(x, y, z)) return true;
- TileEntity tileEntity = world.getTileEntity(x, y, z);
- if (tileEntity == null || !(tileEntity instanceof IGregTechTileEntity)) return true;
- IMetaTileEntity mte = ((IGregTechTileEntity) tileEntity).getMetaTileEntity();
- if (mte instanceof GT_MetaTileEntity_Hatch_Dynamo || mte instanceof GT_MetaTileEntity_Hatch_Energy) {
- int intier = te.mEnergyHatches.get(0).mTier;
- if (((GT_MetaTileEntity_TieredMachineBlock) mte).mTier
- == intier + (te.upstep ? te.mTiers : -te.mTiers)) {
- te.addToMachineList((IGregTechTileEntity) tileEntity, CASING_INDEX);
- return true;
- }
- return false;
- }
- return true;
- }
-
- @Override
- public boolean spawnHint(GT_TileEntity_ManualTrafo te, World world, int x, int y, int z,
- ItemStack itemStack) {
- StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), 2 /* aDots: 3 */);
- return true;
- }
- })
- .build();
-
- @Override
- public IStructureDefinition<GT_TileEntity_ManualTrafo> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Transformer")
- .addInfo("Controller block for the Manual Trafo")
- .addInfo("Operates in 4 diffrent modes:")
- .addInfo("Mode 1: Circuit 0 in controller: Direct-Upstep")
- .addInfo("Mode 2: Circuit 1 in controller: Direct-Downstep")
- .addInfo("Mode 3: Circuit 2 in controller: Tapped-Upstep (currently disabled)")
- .addInfo("Mode 4: Circuit 2 in controller: Tapped-Downstep (currently disabled)")
- .addSeparator()
- .beginVariableStructureBlock(3, 3, 3, 10, 3, 3, false)
- .addController("Front bottom center")
- .addCasingInfoMin("MV Machine Casing", 0, false)
- .addOtherStructurePart("Transformer-Winding Blocks", "1 Layer for each tier transformed")
- .addOtherStructurePart("Nickel-Zinc-Ferrite Blocks", "Middle of Transformer-Winding Blocks")
- .addMaintenanceHatch("Any bottom layer casing", 1)
- .addEnergyHatch("Any bottom layer casing", 1)
- .addDynamoHatch("Any top layer casing", 2)
- .addStructureInfo("---------TAPPED MODE---------")
- .addEnergyHatch("Touching Transformer-Winding Blocks", 3)
- .addDynamoHatch("Touching Transformer-Winding Blocks", 3)
- .addStructureInfo("Hatches touching Transformer-Winding Blocks must be tiered from bottom to top")
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (!this.getBaseMetaTileEntity()
- .isAllowedToWork()) this.stopMachine();
- super.onPostTick(aBaseMetaTileEntity, aTick);
- }
-
- @Override
- public boolean onRunningTick(ItemStack aStack) {
- if (!this.getBaseMetaTileEntity()
- .isAllowedToWork()) {
- this.stopMachine();
- return false;
- }
-
- this.mProgresstime = 0;
- this.mMaxProgresstime = 1;
-
- if (this.getBaseMetaTileEntity()
- .getTimer() % 40 == 0) if (this.mEfficiency < this.getMaxEfficiency(null)) this.mEfficiency += 100;
- else this.mEfficiency = this.getMaxEfficiency(null);
-
- if (this.mode > 1) {
- return false; // this.onRunningTickTabbedMode(); Tapped mode is disable
- }
-
- return this.drainEnergyInput(this.getInputTier() * 2 * this.mEnergyHatches.size()) && this.addEnergyOutput(
- this.getInputTier() * 2 * this.mEnergyHatches.size() * this.mEfficiency / this.getMaxEfficiency(null));
- }
-
- public boolean onRunningTickTabbedMode() {
- boolean ret = false;
- for (GT_MetaTileEntity_Hatch_Dynamo E : this.mDynamoHatches) {
- for (GT_MetaTileEntity_Hatch_Energy I : this.mEnergyHatches) {
-
- long vtt = I.getEUVar() >= V[E.mTier] / 2 && E.getEUVar() < E.maxEUStore() ? I.getEUVar() : 0;
-
- if (vtt == 0) continue;
-
- long vtp = E.getEUVar() + vtt;
- long avt = Math.min(vtp, E.maxEUStore());
- E.setEUVar(avt);
- I.setEUVar(I.getEUVar() - vtt);
- ret = true;
- }
- }
- return ret;
- }
-
- @Override
- public long getInputTier() {
- if (this.mEnergyHatches.size() > 0) return GT_Utility.getTier(
- this.mEnergyHatches.get(0)
- .getBaseMetaTileEntity()
- .getInputVoltage());
- return 0L;
- }
-
- @Override
- public long getOutputTier() {
- if (this.mDynamoHatches.size() > 0) return GT_Utility.getTier(
- this.mDynamoHatches.get(0)
- .getBaseMetaTileEntity()
- .getOutputVoltage());
- return 0L;
- }
-
- @Override
- public boolean checkRecipe(ItemStack itemStack) {
-
- if (!this.getBaseMetaTileEntity()
- .isAllowedToWork()) {
- this.stopMachine();
- return false;
- }
- if (itemStack == null || !itemStack.getUnlocalizedName()
- .startsWith("gt.integrated_circuit")) this.mode = 0;
- else this.mode = (byte) Math.min(3, itemStack.getItemDamage());
- this.upstep = this.mode % 2 == 0;
- this.mProgresstime = 0;
- this.mMaxProgresstime = 1;
- this.mEfficiency = Math.max(this.mEfficiency, 100);
- return this.upstep ? this.getOutputTier() - this.getInputTier() == this.mTiers
- : this.getInputTier() - this.getOutputTier() == this.mTiers;
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
-
- if (itemStack == null || !itemStack.getUnlocalizedName()
- .startsWith("gt.integrated_circuit")) this.mode = 0;
- else this.mode = (byte) Math.min(3, itemStack.getItemDamage());
-
- this.upstep = this.mode % 2 == 0;
- boolean tapmode = this.mode > 1;
-
- if (!this.checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0) || this.mEnergyHatches.size() == 0) return false;
-
- byte intier = this.mEnergyHatches.get(0).mTier;
- for (GT_MetaTileEntity_Hatch_Energy in : this.mEnergyHatches) if (in.mTier != intier) return false;
-
- int mHeight;
- for (mHeight = 1; mHeight <= 8; mHeight++) {
- if (tapmode) {
- this.mTiers = mHeight;
- if (!this.checkPiece(STRUCTURE_PIECE_TAP_LAYER, 2, mHeight, 1)) break;
- } else if (!this.checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0)) break;
- }
- if (!this.checkPiece(STRUCTURE_PIECE_TOP, 1, mHeight, 0)) return false;
- this.mTiers = mHeight - 1;
-
- if (this.mDynamoHatches.size() == 0 || this.mMaintenanceHatches.size() != 1 || this.mTiers == 0) return false;
-
- byte outtier = this.mDynamoHatches.get(0).mTier;
- for (GT_MetaTileEntity_Hatch_Dynamo out : this.mDynamoHatches) {
- if (out.mTier != outtier) return false;
- }
-
- return true;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_ManualTrafo(this.mName);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound ntag) {
- super.saveNBTData(ntag);
- ntag.setInteger("mTiers", this.mTiers);
- ntag.setByte("mMode", this.mode);
- ntag.setBoolean("upstep", this.upstep);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound ntag) {
- super.loadNBTData(ntag);
- this.mTiers = ntag.getInteger("mTiers");
- this.mode = ntag.getByte("mMode");
- this.upstep = ntag.getBoolean("upstep");
- }
-
- @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(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[] { Textures.BlockIcons.getCasingTextureForId(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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX) };
- }
-
- @Override
- public void construct(ItemStack itemStack, boolean b) {
- if (this.mInventory[1] == null || !this.mInventory[1].getUnlocalizedName()
- .startsWith("gt.integrated_circuit")) this.mode = 0;
- else this.mode = (byte) Math.min(3, this.mInventory[1].getItemDamage());
- int mHeight = Math.min(itemStack.stackSize, 8);
- boolean tapmode = this.mode > 1;
- this.buildPiece(STRUCTURE_PIECE_BASE, itemStack, b, 1, 0, 0);
- for (int i = 0; i < mHeight; i++) {
- if (tapmode) this.buildPiece(STRUCTURE_PIECE_TAP_LAYER, itemStack, b, 2, i + 1, 1);
- else this.buildPiece(STRUCTURE_PIECE_LAYER, itemStack, b, 1, i + 1, 0);
- }
- this.buildPiece(STRUCTURE_PIECE_TOP, itemStack, b, 1, mHeight + 1, 0);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java
deleted file mode 100644
index e7a2b090c9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-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 static gregtech.api.util.GT_Utility.filterValidMTEs;
-
-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.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.items.SimpleSubItemClass;
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.Textures;
-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.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
-import gregtech.api.util.GT_Utility;
-
-public class GT_TileEntity_THTR extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_TileEntity_THTR> {
-
- private static final int BASECASINGINDEX = 44;
-
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_THTR> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_THTR>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] {
- { " BBBBBBB ", " BBBBBBBBB ", "BBBBBBBBBBB", "BBBBBBBBBBB", "BBBBBBBBBBB", "BBBBBBBBBBB",
- "BBBBBBBBBBB", "BBBBBBBBBBB", "BBBBBBBBBBB", " BBBBBBBBB ", " BBBBBBB " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " ccccccc ", " c-------c ", "c---------c", "c---------c", "c---------c", "c---------c",
- "c---------c", "c---------c", "c---------c", " c-------c ", " ccccccc " },
- { " bbb~bbb ", " bbbbbbbbb ", "bbbbbbbbbbb", "bbbbbbbbbbb", "bbbbbbbbbbb", "bbbbbbbbbbb",
- "bbbbbbbbbbb", "bbbbbbbbbbb", "bbbbbbbbbbb", " bbbbbbbbb ", " bbbbbbb " }, }))
- .addElement('c', onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings3, 12)))
- .addElement(
- 'b',
- ofChain(
- ofHatchAdder(GT_TileEntity_THTR::addOutputToMachineList, BASECASINGINDEX, 1),
- ofHatchAdder(GT_TileEntity_THTR::addMaintenanceToMachineList, BASECASINGINDEX, 1),
- ofHatchAdder(GT_TileEntity_THTR::addEnergyInputToMachineList, BASECASINGINDEX, 1),
- onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings3, 12))))
- .addElement(
- 'B',
- ofChain(
- ofHatchAdder(GT_TileEntity_THTR::addInputToMachineList, BASECASINGINDEX, 2),
- onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings3, 12))))
- // ofHatchAdderOptional(GT_TileEntity_THTR::addInputToMachineList, BASECASINGINDEX, 2,
- // GregTech_API.sBlockCasings3, 12))
- .build();
-
- private static final int HELIUM_NEEDED = 730000;
- private static final int powerUsage = (int) TierEU.RECIPE_IV / 2;
- private static final int maxcapacity = 675000;
- private static final int mincapacity = 100000;
- private int HeliumSupply;
- private int fuelsupply;
- private boolean empty;
- private int coolanttaking = 0;
- private int mCasing = 0;
-
- public GT_TileEntity_THTR(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- private GT_TileEntity_THTR(String aName) {
- super(aName);
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public IStructureDefinition<GT_TileEntity_THTR> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("High Temperature Reactor")
- .addInfo("Controller block for the Thorium High Temperature Reactor (THTR)")
- .addInfo("Needs to be primed with " + GT_Utility.formatNumbers(HELIUM_NEEDED) + " of helium")
- .addInfo("Needs a constant supply of coolant while running")
- .addInfo("Needs at least 100k Fuel pebbles to start operation (can hold up to 675k pebbles)")
- .addInfo("Consumes up to 0.5% of total Fuel Pellets per Operation depending on efficiency")
- .addInfo("Efficiency decreases exponentially if the internal buffer is not completely filled")
- .addInfo("Reactor will take 4 800L/t of coolant multiplied by efficiency")
- .addInfo("Uses " + GT_Utility.formatNumbers(powerUsage) + " EU/t")
- .addInfo("One Operation takes 9 hours")
- .addSeparator()
- .beginStructureBlock(11, 12, 11, true)
- .addController("Front bottom center")
- .addCasingInfoMin("Radiation Proof Casings", 500, false)
- .addStructureInfo("Corners and the 2 touching blocks are air (cylindric)")
- .addInputBus("Any top layer casing", 2)
- .addInputHatch("Any top layer casing", 2)
- .addOutputBus("Any bottom layer casing", 1)
- .addOutputHatch("Any bottom layer casing", 1)
- .addEnergyHatch("Any bottom layer casing", 1)
- .addMaintenanceHatch("Any bottom layer casing", 1)
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- protected IAlignmentLimits getInitialAlignmentLimits() {
- return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && f.isNotFlipped();
- }
-
- @Override
- public void construct(ItemStack stackSize, boolean hintsOnly) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 5, 11, 0);
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
- this.mCasing = 0;
- return this.checkPiece(STRUCTURE_PIECE_MAIN, 5, 11, 0) && this.mCasing >= 500
- && this.mMaintenanceHatches.size() == 1
- && this.mInputHatches.size() > 0
- && this.mOutputHatches.size() > 0
- && this.mInputBusses.size() > 0
- && this.mOutputBusses.size() > 0
- && this.mEnergyHatches.size() > 0;
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- this.HeliumSupply = aNBT.getInteger("HeliumSupply");
- this.fuelsupply = aNBT.getInteger("fuelsupply");
- this.coolanttaking = aNBT.getInteger("coolanttaking");
- this.empty = aNBT.getBoolean("EmptyMode");
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- super.saveNBTData(aNBT);
- aNBT.setInteger("HeliumSupply", this.HeliumSupply);
- aNBT.setInteger("fuelsupply", this.fuelsupply);
- aNBT.setInteger("coolanttaking", this.coolanttaking);
- aNBT.setBoolean("EmptyMode", this.empty);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- super.onPostTick(aBaseMetaTileEntity, aTick);
- if (aBaseMetaTileEntity.isServerSide() && !this.empty) {
- if (this.HeliumSupply < GT_TileEntity_THTR.HELIUM_NEEDED) {
- for (FluidStack fluidStack : this.getStoredFluids()) {
- if (fluidStack.isFluidEqual(Materials.Helium.getGas(1))) {
- int toget = Math.min(GT_TileEntity_THTR.HELIUM_NEEDED - this.HeliumSupply, fluidStack.amount);
- fluidStack.amount -= toget;
- this.HeliumSupply += toget;
- if (GT_TileEntity_THTR.HELIUM_NEEDED == this.HeliumSupply && fluidStack.amount == 0)
- fluidStack = null;
- }
- }
- }
- if (this.fuelsupply < maxcapacity) {
- this.startRecipeProcessing();
- for (ItemStack itemStack : this.getStoredInputs()) {
- if (GT_Utility.areStacksEqual(
- itemStack,
- new ItemStack(THTRMaterials.aTHTR_Materials, 1, THTRMaterials.MATERIAL_FUEL_INDEX))) {
- int toget = Math.min(maxcapacity - this.fuelsupply, itemStack.stackSize);
- if (toget == 0) continue;
- itemStack.stackSize -= toget;
- this.fuelsupply += toget;
- }
- }
- this.endRecipeProcessing();
- this.updateSlots();
- }
- }
- }
-
- @Override
- public boolean checkRecipe(ItemStack controllerStack) {
-
- if (this.empty) {
- if (this.HeliumSupply > 0 || this.fuelsupply > 0) {
- this.mEfficiency = 10000;
- this.mMaxProgresstime = 100;
- return true;
- }
- return false;
- }
- if (this.HeliumSupply < GT_TileEntity_THTR.HELIUM_NEEDED || this.fuelsupply < mincapacity) return false;
-
- double eff = Math
- .min(Math.pow((this.fuelsupply - mincapacity) / ((maxcapacity - mincapacity) / 10D), 2D) + 1, 100D) / 100D
- - (this.getIdealStatus() - this.getRepairStatus()) / 10D;
- if (eff <= 0D) return false;
-
- int toReduce = MathUtils.floorInt(this.fuelsupply * 0.005D * eff);
-
- final int originalToReduce = toReduce;
- int burnedballs = toReduce / 64;
- if (burnedballs > 0) toReduce -= burnedballs * 64;
-
- int meta = THTRMaterials.MATERIAL_USED_FUEL_INDEX;
-
- ItemStack[] toOutput = { new ItemStack(THTRMaterials.aTHTR_Materials, burnedballs, meta),
- new ItemStack(THTRMaterials.aTHTR_Materials, toReduce, meta + 1) };
- if (!this.canOutputAll(toOutput)) return false;
-
- this.fuelsupply -= originalToReduce;
- this.mOutputItems = toOutput;
-
- // this.updateSlots(); not needed ?
-
- this.coolanttaking = (int) (4800D * eff);
- this.mEfficiency = (int) (eff * 10000D);
- this.mEUt = -powerUsage;
- this.mMaxProgresstime = 648000;
- return true;
- }
-
- @Override
- public boolean onRunningTick(ItemStack aStack) {
-
- if (this.empty) {
- this.addOutput(Materials.Helium.getGas(this.HeliumSupply));
- this.addOutput(
- new ItemStack(THTRMaterials.aTHTR_Materials, this.fuelsupply, THTRMaterials.MATERIAL_FUEL_INDEX));
- this.HeliumSupply = 0;
- this.fuelsupply = 0;
- this.updateSlots();
- return true;
- }
-
- if (!super.onRunningTick(aStack)) return false;
-
- int takecoolant = this.coolanttaking;
- int drainedamount = 0;
-
- for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
- FluidStack tLiquid = tHatch.getFluid();
- if (tLiquid != null && tLiquid.isFluidEqual(FluidRegistry.getFluidStack("ic2coolant", 1))) {
- FluidStack drained = tHatch.drain(takecoolant, true);
- takecoolant -= drained.amount;
- drainedamount += drained.amount;
- if (takecoolant <= 0) break;
- }
- }
-
- if (drainedamount > 0) this.addOutput(FluidRegistry.getFluidStack("ic2hotcoolant", drainedamount));
-
- this.updateSlots();
-
- return true;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_THTR(this.mName);
- }
-
- @Override
- public String[] getInfoData() {
- return new String[] { "Progress:",
- GT_Utility.formatNumbers(this.mProgresstime / 20) + "secs /"
- + GT_Utility.formatNumbers(this.mMaxProgresstime / 20)
- + "secs",
- "TRISO-Pebbles:",
- GT_Utility.formatNumbers(this.fuelsupply) + "pcs. / " + GT_Utility.formatNumbers(this.fuelsupply) + "psc.",
- "Helium-Level:",
- GT_Utility.formatNumbers(this.HeliumSupply) + "L / "
- + GT_Utility.formatNumbers(GT_TileEntity_THTR.HELIUM_NEEDED)
- + "L",
- "Coolant/t:", GT_Utility.formatNumbers(this.mProgresstime == 0 ? 0 : this.coolanttaking) + "L/t",
- "Problems:", String.valueOf(this.getIdealStatus() - this.getRepairStatus()) };
- }
-
- @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(GT_TileEntity_THTR.BASECASINGINDEX), TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE)
- .extFacing()
- .build(),
- TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW)
- .extFacing()
- .glow()
- .build() };
- return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(GT_TileEntity_THTR.BASECASINGINDEX),
- TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER)
- .extFacing()
- .build(),
- TextureFactory.builder()
- .addIcon(Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_GLOW)
- .extFacing()
- .glow()
- .build() };
- }
- return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(GT_TileEntity_THTR.BASECASINGINDEX) };
- }
-
- @Override
- public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- if (this.mMaxProgresstime > 0) {
- GT_Utility.sendChatToPlayer(aPlayer, "THTR mode cannot be changed while the machine is running.");
- return;
- }
- this.empty = !this.empty;
- GT_Utility.sendChatToPlayer(
- aPlayer,
- "THTR is now running in " + (this.empty ? "emptying mode." : "normal Operation"));
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-
- public static class THTRMaterials {
-
- public static final SimpleSubItemClass aTHTR_Materials = new SimpleSubItemClass(
- "BISOPelletCompound", // 0
- "BISOPelletBall", // 1
- "TRISOPelletCompound", // 2
- "TRISOPelletBall", // 3
- "TRISOPellet", // 4
- "BurnedOutTRISOPelletBall", // 5
- "BurnedOutTRISOPellet" // 6
- );
- public static final int MATERIAL_FUEL_INDEX = 4;
- public static final int MATERIAL_USED_FUEL_INDEX = 5;
-
- public static void registeraTHR_Materials() {
- GameRegistry.registerItem(GT_TileEntity_THTR.THTRMaterials.aTHTR_Materials, "bw.THTRMaterials");
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java
deleted file mode 100644
index a1e1f1fd46..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-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.ofTileAdder;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
-import static gregtech.api.enums.GT_Values.V;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.minecraft.block.Block;
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.tileentity.TileEntityDispenser;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.world.World;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.items.BW_Stonage_Rotors;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.common.tileentities.classic.BW_RotorBlock;
-import com.gtnewhorizon.structurelib.StructureLibAPI;
-import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-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.IStructureElementNoPlacement;
-import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-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.FakeSyncWidget;
-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 cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.Textures;
-import gregtech.api.gui.modularui.GUITextureSet;
-import gregtech.api.interfaces.IIconContainer;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
-import gregtech.api.interfaces.modularui.IGetTitleColor;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
-import gregtech.api.objects.ItemData;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.render.TextureFactory;
-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.items.GT_MetaGenerated_Tool_01;
-
-public class GT_TileEntity_Windmill extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_TileEntity_Windmill>
- implements ISurvivalConstructable, IGetTitleColor {
-
- private static final IIcon[] iIcons = new IIcon[2];
- private static final IIconContainer[] iIconContainers = new IIconContainer[2];
- private static final ITexture[] iTextures = new ITexture[3];
-
- private BW_RotorBlock rotorBlock;
- private int mDoor = 0;
- private int mHardenedClay = 0;
- private int mMulti = 16;
-
- public GT_TileEntity_Windmill(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- private GT_TileEntity_Windmill(String aName) {
- super(aName);
- }
-
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_Windmill> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_Windmill>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] { { " ", " ", " ", " p ", " ", " ", " " },
- { " ", " ", " ppp ", " p p ", " ppp ", " ", " " },
- { " ", " ppppp ", " p p ", " p p ", " p p ", " ppppp ", " " },
- { " ppppp ", "p p", "p p", "p p", "p p", "p p", " ppppp " },
- { " ppspp ", "p p", "p p", "p p", "p p", "p p", " ppppp " },
- { " ppppp ", "p p", "p p", "p p", "p p", "p p", " ppppp " },
- { " ", " ppppp ", " p p ", " p p ", " p p ", " ppppp ", " " },
- { " ", " ccc ", " c c ", " c c ", " c c ", " ccc ", " " },
- { " ", " ccc ", " c c ", " c c ", " c c ", " ccc ", " " },
- { " ", " ccc ", " c c ", " c c ", " c c ", " ccc ", " " },
- { " ", " ccc ", " c c ", " c c ", " c c ", " ccc ", " " },
- { " bb~bb ", "bbbbbbb", "bbbbbbb", "bbbbbbb", "bbbbbbb", "bbbbbbb", " bbbbb " }, }))
- .addElement('p', ofBlockAnyMeta(Blocks.planks))
- .addElement(
- 'c',
- ofChain(
- onElementPass(t -> t.mHardenedClay++, ofBlock(Blocks.hardened_clay, 0)),
- ofTileAdder(GT_TileEntity_Windmill::addDispenserToOutputSet, Blocks.hardened_clay, 0),
- onElementPass(t -> t.mDoor++, new IStructureElementNoPlacement<GT_TileEntity_Windmill>() {
-
- private final IStructureElement<GT_TileEntity_Windmill> delegate = ofBlock(Blocks.wooden_door, 0);
-
- @Override
- public boolean check(GT_TileEntity_Windmill gt_tileEntity_windmill, World world, int x, int y,
- int z) {
- return this.delegate.check(gt_tileEntity_windmill, world, x, y, z);
- }
-
- @Override
- public boolean spawnHint(GT_TileEntity_Windmill gt_tileEntity_windmill, World world, int x, int y,
- int z, ItemStack trigger) {
- return this.delegate.spawnHint(gt_tileEntity_windmill, world, x, y, z, trigger);
- }
- })))
- .addElement('b', ofBlock(Blocks.brick_block, 0))
- .addElement('s', new IStructureElement<GT_TileEntity_Windmill>() {
-
- @Override
- public boolean check(GT_TileEntity_Windmill t, World world, int x, int y, int z) {
- TileEntity tileEntity = world.getTileEntity(x, y, z);
- return t.setRotorBlock(tileEntity);
- }
-
- @Override
- public boolean spawnHint(GT_TileEntity_Windmill t, World world, int x, int y, int z, ItemStack trigger) {
- StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), 0);
- return true;
- }
-
- @Override
- public boolean placeBlock(GT_TileEntity_Windmill gt_tileEntity_windmill, World world, int x, int y, int z,
- ItemStack trigger) {
- return false;
- }
-
- @Override
- public BlocksToPlace getBlocksToPlace(GT_TileEntity_Windmill gt_tileEntity_windmill, World world, int x,
- int y, int z, ItemStack trigger, AutoPlaceEnvironment env) {
- return BlocksToPlace.create(new ItemStack(ItemRegistry.ROTORBLOCK));
- }
- })
- .build();
-
- @Override
- public IStructureDefinition<GT_TileEntity_Windmill> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected IAlignmentLimits getInitialAlignmentLimits() {
- return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && f.isNotFlipped();
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Windmill")
- .addInfo("Controller block for the Windmill")
- .addInfo("A primitive Grinder powered by Kinetic energy")
- .addInfo("Speed and output will be affected by wind speed, recipe and rotor")
- .addInfo("Please use the Primitive Rotor")
- .addInfo("Macerates 16 items at a time")
- .addInfo("The structure is too complex!")
- .addInfo("Follow the StructureLib hologram projector to build the main structure.")
- .addSeparator()
- .beginStructureBlock(7, 12, 7, false)
- .addController("Front bottom center")
- .addCasingInfoMin("Hardened Clay block", 40, false)
- .addOtherStructurePart("Dispenser", "Any Hardened Clay block")
- .addOtherStructurePart("0-1 Wooden door", "Any Hardened Clay block")
- .addStructureHint("Primitive Kinetic Shaftbox", 1)
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- private final Set<TileEntityDispenser> tileEntityDispensers = new HashSet<>();
-
- @Override
- public boolean onRunningTick(ItemStack aStack) {
- if (this.mMaxProgresstime > 0) this.mProgresstime += this.rotorBlock.getGrindPower();
- if (!this.rotorBlock.rotorSlot.isEmpty()) this.setRotorDamage(this.rotorBlock, this.rotorBlock.getGrindPower());
- return this.rotorBlock.getGrindPower() > 0;
- }
-
- @Override
- public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
- ItemStack aStack) {
- return true;
- }
-
- @Override
- public boolean doRandomMaintenanceDamage() {
- return true;
- }
-
- private float[] multiplierRecipe(ItemStack itemStack) {
- // will return max and min value of the multiplier, the average of these is used to calculate the multiplier.
- final Item item = itemStack.getItem();
- if (item == Items.wheat) {
- return new float[] { 1.13f, 1.5f };
- }
- final Block block = Block.getBlockFromItem(item);
- if (item == Items.bone || block == Blocks.glowstone || block == Blocks.pumpkin) {
- return new float[] { 0.8f, 1f };
- }
- if (block == Blocks.gravel || block == Blocks.cobblestone
- || block == Blocks.stone
- || block == Blocks.sandstone
- || block == Blocks.clay
- || block == Blocks.hardened_clay
- || block == Blocks.stained_hardened_clay
- || block == Blocks.wool
- || block == Blocks.netherrack
- || block == Blocks.log
- || block == Blocks.log2) {
- return new float[] { 1f, 1.5f };
- }
- final ItemData association = GT_OreDictUnificator.getAssociation(itemStack);
- final OrePrefixes prefix = association == null ? null : association.mPrefix;
- if (prefix == null || association.mMaterial == null
- || association.mMaterial.mMaterial == null
- || association.mMaterial.mMaterial.getDust(1) == null) {
- return new float[] { 1f, 1f };
- }
- if (OrePrefixes.ore == prefix || OrePrefixes.oreNetherrack == prefix
- || OrePrefixes.oreEndstone == prefix
- || OrePrefixes.oreBlackgranite == prefix
- || OrePrefixes.oreRedgranite == prefix
- || OrePrefixes.oreMarble == prefix
- || OrePrefixes.oreBasalt == prefix) {
- return new float[] { 0.5f, 1f };
- }
- if (OrePrefixes.stone == prefix || OrePrefixes.stoneBricks == prefix
- || OrePrefixes.stoneChiseled == prefix
- || OrePrefixes.stoneCobble == prefix
- || OrePrefixes.stoneCracked == prefix
- || OrePrefixes.stoneMossy == prefix
- || OrePrefixes.stoneMossyBricks == prefix
- || OrePrefixes.stoneSmooth == prefix
- || OrePrefixes.cobblestone == prefix) {
- return new float[] { 1f, 1.5f };
- }
- return new float[] { 1f, 1f };
- }
-
- @Override
- public boolean checkRecipe(ItemStack itemStack) {
- if (itemStack == null || itemStack.getItem() == null) return false;
-
- if (this.mOutputItems == null) this.mOutputItems = new ItemStack[2];
-
- GT_Recipe tRecipe = RecipeMaps.maceratorRecipes
- .findRecipe(this.getBaseMetaTileEntity(), false, false, V[1], null, itemStack);
- if (tRecipe == null) {
- return false;
- }
-
- if (tRecipe.getOutput(0) != null) {
- // Decrease input stack by appropriate amount (Not always 1)
- for (int i = 0; i < this.mMulti; i++) {
- if (!tRecipe.isRecipeInputEqual(true, null, itemStack)) {
- this.mMulti = i;
- break;
- }
- }
- this.updateSlots();
- this.mOutputItems[0] = tRecipe.getOutput(0);
- float[] mRecipe = this.multiplierRecipe(itemStack);
- float multiper = Math.min(
- mRecipe[1],
- Math.max(
- mRecipe[0],
- 2f * (float) Math.sqrt((float) 1 / (this.rotorBlock.getWindStrength() + 1))
- * this.OutputMultiplier(this.rotorBlock)
- * (mRecipe[0] + mRecipe[1])));
- int amount = (int) Math.floor(multiper * (this.mOutputItems[0].stackSize * this.mMulti));
-
- // Split ItemStack --by gtpp
- List<ItemStack> splitStacks = new ArrayList<>();
- while (amount > this.mOutputItems[0].getMaxStackSize()) {
- ItemStack tmp = this.mOutputItems[0].copy();
- tmp.stackSize = this.mOutputItems[0].getMaxStackSize();
- amount -= this.mOutputItems[0].getMaxStackSize();
- splitStacks.add(tmp);
- }
- ItemStack tmp = this.mOutputItems[0].copy();
- tmp.stackSize = amount;
- splitStacks.add(tmp);
- this.mOutputItems = splitStacks.toArray(new ItemStack[splitStacks.size()]);
- }
- this.mMaxProgresstime = tRecipe.mDuration * 2 * 100 * this.mMulti / this.getSpeed(this.rotorBlock);
- this.mMulti = 16;
- return true;
- }
-
- @Override
- public void stopMachine() {
- this.getBaseMetaTileEntity()
- .disableWorking();
- }
-
- public boolean addDispenserToOutputSet(TileEntity aTileEntity) {
- if (aTileEntity instanceof TileEntityDispenser) {
- this.tileEntityDispensers.add((TileEntityDispenser) aTileEntity);
- return true;
- }
- return false;
- }
-
- public boolean setRotorBlock(TileEntity aTileEntity) {
- if (aTileEntity instanceof BW_RotorBlock) {
- this.rotorBlock = (BW_RotorBlock) aTileEntity;
- return true;
- }
- return false;
- }
-
- @Override
- public boolean addOutput(ItemStack aStack) {
- if (GT_Utility.isStackInvalid(aStack)) return false;
-
- for (TileEntityDispenser tHatch : this.tileEntityDispensers) {
- for (int i = tHatch.getSizeInventory() - 1; i >= 0; i--) {
- if (tHatch.getStackInSlot(i) == null || GT_Utility.areStacksEqual(tHatch.getStackInSlot(i), aStack)
- && aStack.stackSize + tHatch.getStackInSlot(i).stackSize <= 64) {
- if (GT_Utility.areStacksEqual(tHatch.getStackInSlot(i), aStack)) {
- ItemStack merge = tHatch.getStackInSlot(i)
- .copy();
- merge.stackSize = aStack.stackSize + tHatch.getStackInSlot(i).stackSize;
- tHatch.setInventorySlotContents(i, merge);
- } else {
- tHatch.setInventorySlotContents(i, aStack.copy());
- }
-
- if (GT_Utility.areStacksEqual(tHatch.getStackInSlot(i), aStack)) {
- aStack = null;
- return true;
- }
- tHatch.setInventorySlotContents(i, null);
- aStack = null;
- return false;
- }
- }
- }
- return false;
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack itemStack) {
-
- this.tileEntityDispensers.clear();
- this.mDoor = 0;
- this.mHardenedClay = 0;
-
- if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 3, 11, 0) || this.tileEntityDispensers.isEmpty()
- || this.mDoor > 2
- || this.mHardenedClay < 40) return false;
-
- this.mWrench = true;
- this.mScrewdriver = true;
- this.mSoftHammer = true;
- this.mHardHammer = true;
- this.mSolderingTool = true;
- this.mCrowbar = true;
-
- return true;
- }
-
- @Override
- public int getCurrentEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public void updateSlots() {
- if (this.mInventory[1] != null && this.mInventory[1].stackSize <= 0) {
- this.mInventory[1] = null;
- }
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_Windmill(this.mName);
- }
-
- @Override
- public String[] getInfoData() {
- return new String[] { "Progress:",
- this.mProgresstime + " Grindings of " + this.mMaxProgresstime + " needed Grindings", "GrindPower:",
- this.rotorBlock.getGrindPower() + "KU/t" };
- }
-
- @SideOnly(Side.CLIENT)
- @Override
- public void registerIcons(IIconRegister aBlockIconRegister) {
- GT_TileEntity_Windmill.iIcons[0] = Blocks.brick_block.getIcon(0, 0);
- GT_TileEntity_Windmill.iIconContainers[0] = new IIconContainer() {
-
- @Override
- public IIcon getIcon() {
- return GT_TileEntity_Windmill.iIcons[0];
- }
-
- @Override
- public IIcon getOverlayIcon() {
- return null;
- }
-
- @Override
- public ResourceLocation getTextureFile() {
- return new ResourceLocation("brick");
- }
- };
-
- GT_TileEntity_Windmill.iIcons[1] = aBlockIconRegister.registerIcon(MainMod.MOD_ID + ":windmill_top");
- GT_TileEntity_Windmill.iIconContainers[1] = new IIconContainer() {
-
- @Override
- public IIcon getIcon() {
- return GT_TileEntity_Windmill.iIcons[1];
- }
-
- @Override
- public IIcon getOverlayIcon() {
- return null;
- }
-
- @Override
- public ResourceLocation getTextureFile() {
- return new ResourceLocation(MainMod.MOD_ID + ":windmill_top");
- }
- };
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
- int aColorIndex, boolean aActive, boolean aRedstone) {
-
- ITexture[] ret = new ITexture[6];
-
- if (this.isClientSide()) {
-
- if (facing == side || side == ForgeDirection.DOWN) {
- GT_TileEntity_Windmill.iTextures[0] = TextureFactory.of(GT_TileEntity_Windmill.iIconContainers[0]);
- Arrays.fill(ret, GT_TileEntity_Windmill.iTextures[0]);
- } else if (side == ForgeDirection.UP) {
- GT_TileEntity_Windmill.iTextures[1] = TextureFactory.of(GT_TileEntity_Windmill.iIconContainers[1]);
- Arrays.fill(ret, GT_TileEntity_Windmill.iTextures[1]);
- } else {
- GT_TileEntity_Windmill.iTextures[2] = TextureFactory.of(Textures.BlockIcons.COVER_WOOD_PLATE);
- Arrays.fill(ret, GT_TileEntity_Windmill.iTextures[2]);
- }
- }
- return ret;
- }
-
- public boolean isClientSide() {
- if (this.getBaseMetaTileEntity()
- .getWorld() != null)
- return this.getBaseMetaTileEntity()
- .getWorld().isRemote
- ? FMLCommonHandler.instance()
- .getSide() == Side.CLIENT
- : FMLCommonHandler.instance()
- .getEffectiveSide() == Side.CLIENT;
- return FMLCommonHandler.instance()
- .getEffectiveSide() == Side.CLIENT;
- }
-
- @Override
- public void construct(ItemStack itemStack, boolean b) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 3, 11, 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
- if (this.mMachine) return -1;
- return this.survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 11, 0, elementBudget, env, false, true);
- }
-
- public float OutputMultiplier(BW_RotorBlock rotorBlock) {
- try {
- return ((BW_Stonage_Rotors) rotorBlock.rotorSlot.get()
- .getItem()).getmRotor();
- } catch (Exception e) {
- return 1f;
- }
- }
-
- public int getSpeed(BW_RotorBlock rotorBlock) {
- try {
- return ((BW_Stonage_Rotors) rotorBlock.rotorSlot.get()
- .getItem()).getSpeed();
- } catch (Exception e) {
- return 1;
- }
- }
-
- public void setRotorDamage(BW_RotorBlock rotorBlock, int damage) {
- try {
- ((BW_Stonage_Rotors) rotorBlock.rotorSlot.get()
- .getItem()).damageItemStack(rotorBlock.rotorSlot.get(), damage);
- } catch (Exception e) {
- rotorBlock.rotorSlot.damage(damage, false);
- }
- }
-
- @Override
- public GUITextureSet getGUITextureSet() {
- return new GUITextureSet().setMainBackground(BW_UITextures.BACKGROUND_BROWN)
- .setItemSlot(BW_UITextures.SLOT_BROWN)
- .setTitleTab(
- BW_UITextures.TAB_TITLE_BROWN,
- BW_UITextures.TAB_TITLE_DARK_BROWN,
- BW_UITextures.TAB_TITLE_ANGULAR_BROWN);
- }
-
- @Override
- public void addGregTechLogo(ModularWindow.Builder builder) {
- builder.widget(
- new DrawableWidget().setDrawable(BW_UITextures.PICTURE_BW_LOGO_47X21)
- .setSize(47, 21)
- .setPos(123, 59));
- }
-
- @Override
- public int getTitleColor() {
- return this.COLOR_TITLE_WHITE.get();
- }
-
- @Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- builder.widget(
- new SlotWidget(this.inventoryHandler, 1).setBackground(
- this.getGUITextureSet()
- .getItemSlot())
- .setPos(59, 35))
- .widget(new DrawableWidget() {
-
- private static final int DIVIDER = 125;
-
- @Override
- public void onScreenUpdate() {
- super.onScreenUpdate();
- if (GT_TileEntity_Windmill.this.mMaxProgresstime > 0) {
- if (System.currentTimeMillis() / DIVIDER % 40 == 30)
- this.setDrawable(BW_UITextures.PICTURE_WINDMILL_ROTATING[3]);
- else if (System.currentTimeMillis() / DIVIDER % 40 == 20)
- this.setDrawable(BW_UITextures.PICTURE_WINDMILL_ROTATING[2]);
- else if (System.currentTimeMillis() / DIVIDER % 40 == 10)
- this.setDrawable(BW_UITextures.PICTURE_WINDMILL_ROTATING[1]);
- else if (System.currentTimeMillis() / DIVIDER % 40 == 0)
- this.setDrawable(BW_UITextures.PICTURE_WINDMILL_ROTATING[0]);
- } else {
- this.setDrawable(BW_UITextures.PICTURE_WINDMILL_EMPTY);
- }
- }
- }.setDrawable(BW_UITextures.PICTURE_WINDMILL_EMPTY)
- .setPos(85, 27)
- .setSize(32, 32))
- .widget(new FakeSyncWidget.IntegerSyncer(() -> this.mMaxProgresstime, val -> this.mMaxProgresstime = val))
- .widget(
- new ItemDrawable(
- () -> this.mMachine && !this.getBaseMetaTileEntity()
- .isActive()
- ? GT_MetaGenerated_Tool_01.INSTANCE
- .getToolWithStats(GT_MetaGenerated_Tool_01.SOFTMALLET, 1, null, null, null)
- : null).asWidget()
- .setPos(66, 66))
- .widget(
- new FakeSyncWidget.BooleanSyncer(
- () -> this.getBaseMetaTileEntity()
- .isActive(),
- val -> this.getBaseMetaTileEntity()
- .setActive(val)))
- .widget(
- new TextWidget(GT_Utility.trans("138", "Incomplete Structure."))
- .setDefaultColor(this.COLOR_TEXT_WHITE.get())
- .setMaxWidth(150)
- .setEnabled(widget -> !this.mMachine)
- .setPos(92, 22))
- .widget(new FakeSyncWidget.BooleanSyncer(() -> this.mMachine, val -> this.mMachine = val));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java
deleted file mode 100644
index c8ea85d182..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
-import static gregtech.api.enums.GT_HatchElement.*;
-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 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.util.EnumChatFormatting;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
-import com.gtnewhorizon.structurelib.structure.IItemSource;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.HeatingCoilLevel;
-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.logic.ProcessingLogic;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
-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_TileEntity_MegaBlastFurnace extends GT_TileEntity_MegaMultiBlockBase<GT_TileEntity_MegaBlastFurnace>
- implements ISurvivalConstructable {
-
- private static final int CASING_INDEX = 11;
- private static final IStructureDefinition<GT_TileEntity_MegaBlastFurnace> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_MegaBlastFurnace>builder()
- .addShape("main", createShape())
- .addElement('=', StructureElementAirNoHint.getInstance())
- .addElement(
- 't',
- buildHatchAdder(GT_TileEntity_MegaBlastFurnace.class)
- .atLeast(
- OutputHatch.withAdder(GT_TileEntity_MegaBlastFurnace::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',
- withChannel(
- "coil",
- ofCoil(GT_TileEntity_MegaBlastFurnace::setCoilLevel, GT_TileEntity_MegaBlastFurnace::getCoilLevel)))
- .addElement(
- 'g',
- withChannel(
- "glass",
- BorosilicateGlass
- .ofBoroGlass((byte) 0, (byte) 1, Byte.MAX_VALUE, (te, t) -> te.glassTier = t, te -> te.glassTier)))
- .addElement(
- 'b',
- buildHatchAdder(GT_TileEntity_MegaBlastFurnace.class)
- .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy.or(ExoticEnergy))
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(GregTech_API.sBlockCasings1, CASING_INDEX))
- .build();
-
- private static String[][] createShape() {
- String[][] raw = new String[20][];
-
- raw[0] = new String[15];
- String topCasing = "ttttttttttttttt";
- String middleTopCasing = "tttttttmttttttt";
- raw[0][0] = topCasing;
- for (int i = 1; i < 15; i++) {
- raw[0][i] = topCasing;
- }
- raw[0][7] = middleTopCasing;
-
- raw[1] = new String[15];
- String allGlass = "ggggggggggggggg";
- String allCoil = "gCCCCCCCCCCCCCg";
- String middleLine = "gC===========Cg";
- raw[1][0] = allGlass;
- raw[1][1] = allCoil;
- raw[1][13] = allCoil;
- raw[1][14] = allGlass;
- for (int i = 2; i < 13; i++) {
- raw[1][i] = middleLine;
- }
- for (int i = 2; i < 19; i++) {
- raw[i] = raw[1];
- }
- String bottomCasing = "bbbbbbbbbbbbbbb";
- raw[19] = new String[15];
- for (int i = 0; i < 15; i++) {
- raw[19][i] = bottomCasing;
- }
-
- raw[17] = Arrays.copyOf(raw[17], raw[17].length);
- raw[17][0] = "ggggggg~ggggggg";
-
- return transpose(raw);
- }
-
- private HeatingCoilLevel mCoilLevel;
- 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) };
- private int mHeatingCapacity;
- private byte glassTier;
- private final static int polPtick = ConfigHandler.basePollutionMBFSecond / 20 * ConfigHandler.megaMachinesMax;
-
- public GT_TileEntity_MegaBlastFurnace(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_MegaBlastFurnace(String aName) {
- super(aName);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_TileEntity_MegaBlastFurnace(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 Mega 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(20 * this.getPollutionPerTick(null))
- .addSeparator()
- .beginStructureBlock(15, 20, 15, true)
- .addController("3rd layer center")
- .addCasingInfoRange("Heat Proof Machine Casing", 0, 279, false)
- .addOtherStructurePart("864x Heating Coils", "Inner 13x18x13 (Hollow)")
- .addOtherStructurePart("1007x Borosilicate Glass", "Outer 15x18x15")
- .addStructureInfo("The glass tier limits the Energy Input tier")
- .addEnergyHatch("Any bottom layer casing")
- .addMaintenanceHatch("Any bottom layer casing")
- .addMufflerHatch("Top middle")
- .addInputBus("Any bottom layer casing")
- .addInputHatch("Any bottom layer casing")
- .addOutputBus("Any bottom layer casing")
- .addOutputHatch("Gasses, Any top layer casing")
- .addStructureInfo("Recovery amount scales with Muffler Hatch tier")
- .addOutputHatch("Platline fluids, Any bottom layer casing")
- .addStructureHint("This Mega Multiblock is too big to have its structure hologram displayed fully.")
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS);
- return tt;
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- this.glassTier = aNBT.getByte("glasTier");
- if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
- this.inputSeparation = aNBT.getBoolean("isBussesSeparate");
- }
- if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
- this.batchMode = aNBT.getBoolean("mUseMultiparallelMode");
- }
- }
-
- @Override
- public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
- float aX, float aY, float aZ) {
- if (!aPlayer.isSneaking()) {
- this.inputSeparation = !this.inputSeparation;
- GT_Utility.sendChatToPlayer(
- aPlayer,
- StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + this.inputSeparation);
- return true;
- }
- this.batchMode = !this.batchMode;
- if (this.batchMode) {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
- int aColorIndex, boolean aActive, boolean aRedstone) {
- if (side == facing) {
- 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 void saveNBTData(NBTTagCompound aNBT) {
- super.saveNBTData(aNBT);
- aNBT.setByte("glasTier", this.glassTier);
- }
-
- @Override
- public int getPollutionPerTick(ItemStack aStack) {
- return polPtick;
- }
-
- 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 this.mPollutionOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity);
- }
- return false;
- }
-
- @Override
- protected String[] getExtendedInfoData() {
- return new String[] { StatCollector.translateToLocal("GT5U.EBF.heat") + ": "
- + EnumChatFormatting.GREEN
- + GT_Utility.formatNumbers(this.mHeatingCapacity)
- + EnumChatFormatting.RESET
- + " K" };
- }
-
- @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(GT_TileEntity_MegaBlastFurnace.this.mHeatingCapacity)
- .setHeatOC(true)
- .setHeatDiscount(true);
- }
-
- @Override
- protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
- return recipe.mSpecialValue <= GT_TileEntity_MegaBlastFurnace.this.mHeatingCapacity
- ? CheckRecipeResultRegistry.SUCCESSFUL
- : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
- }
- }.setMaxParallel(ConfigHandler.megaMachinesMax);
- }
-
- @Override
- protected IAlignmentLimits getInitialAlignmentLimits() {
- return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && f.isNotFlipped();
- }
-
- @Override
- public IStructureDefinition<GT_TileEntity_MegaBlastFurnace> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- public void construct(ItemStack stackSize, boolean hintsOnly) {
- this.buildPiece("main", stackSize, hintsOnly, 7, 17, 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
- if (this.mMachine) return -1;
- int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
- this.glassTier = 0;
- this.setCoilLevel(HeatingCoilLevel.None);
- return this.survivialBuildPiece("main", stackSize, 7, 17, 0, realBudget, source, actor, false, true);
- }
-
- public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
- this.mCoilLevel = aCoilLevel;
- }
-
- public HeatingCoilLevel getCoilLevel() {
- return this.mCoilLevel;
- }
-
- @Override
- public boolean addOutput(FluidStack aLiquid) {
- if (aLiquid == null) return false;
- FluidStack tLiquid = aLiquid.copy();
- boolean isOutputPollution = false;
- for (FluidStack pollutionFluidStack : this.pollutionFluidStacks) {
- if (!tLiquid.isFluidEqual(pollutionFluidStack)) continue;
-
- isOutputPollution = true;
- break;
- }
- ArrayList<GT_MetaTileEntity_Hatch_Output> tOutputHatches;
- if (isOutputPollution) {
- tOutputHatches = this.mPollutionOutputHatches;
- int pollutionReduction = 0;
- for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
- pollutionReduction = 100 - tHatch.calculatePollutionReduction(100);
- break;
- }
- tLiquid.amount = tLiquid.amount * pollutionReduction / 100;
- } else {
- tOutputHatches = this.mOutputHatches;
- }
- return dumpFluid(tOutputHatches, tLiquid, true) || dumpFluid(tOutputHatches, tLiquid, false);
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
- this.mHeatingCapacity = 0;
- this.glassTier = 0;
-
- this.setCoilLevel(HeatingCoilLevel.None);
-
- this.mPollutionOutputHatches.clear();
-
- if (!this.checkPiece("main", 7, 17, 0) || this.getCoilLevel() == HeatingCoilLevel.None
- || this.mMaintenanceHatches.size() != 1) return false;
-
- if (this.glassTier < 8) {
- for (int i = 0; i < this.mExoticEnergyHatches.size(); ++i) {
- GT_MetaTileEntity_Hatch hatch = this.mExoticEnergyHatches.get(i);
- if (hatch.getConnectionType() == GT_MetaTileEntity_Hatch.ConnectionType.LASER) {
- return false;
- }
- if (this.glassTier < hatch.mTier) {
- return false;
- }
- }
- for (int i = 0; i < this.mEnergyHatches.size(); ++i) {
- if (this.glassTier < this.mEnergyHatches.get(i).mTier) {
- return false;
- }
- }
- }
-
- this.mHeatingCapacity = (int) this.getCoilLevel()
- .getHeat() + 100 * (BW_Util.getTier(this.getMaxInputEu()) - 2);
-
- return true;
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return RecipeMaps.blastFurnaceRecipes;
- }
-
- @Override
- public int getRecipeCatalystPriority() {
- return -2;
- }
-
- @Override
- public boolean supportsInputSeparation() {
- return true;
- }
-
- @Override
- public boolean supportsBatchMode() {
- return true;
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java
deleted file mode 100644
index 4b11f8d500..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-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.*;
-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 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.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
-import com.gtnewhorizon.structurelib.structure.IItemSource;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-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_Hatch;
-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_Utility;
-
-public class GT_TileEntity_MegaChemicalReactor
- extends GT_TileEntity_MegaMultiBlockBase<GT_TileEntity_MegaChemicalReactor> implements ISurvivalConstructable {
-
- private byte glassTier;
-
- public GT_TileEntity_MegaChemicalReactor(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_MegaChemicalReactor(String aName) {
- super(aName);
- }
-
- @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 Chemical Reactor")
- .addInfo("What molecule do you want to synthesize")
- .addInfo("Or you want to replace something in this molecule")
- .addInfo("The structure is too complex!")
- .addInfo("Follow the Structure Lib hologram projector to build the main structure.")
- .addSeparator()
- .beginStructureBlock(5, 5, 9, false)
- .addController("Front center")
- .addStructureInfo("46x Chemically Inert Machine Casing (minimum)")
- .addStructureInfo("7x Fusion Coil Block")
- .addStructureInfo("28x PTFE Pipe Casing")
- .addStructureInfo("64x Borosilicate Glass Block (any tier)")
- .addStructureInfo("The glass tier limits the Energy Input tier")
- .addEnergyHatch("Hint block ", 3)
- .addMaintenanceHatch("Hint block ", 2)
- .addInputHatch("Hint block ", 1)
- .addInputBus("Hint block ", 1)
- .addOutputBus("Hint block ", 1)
- .addOutputHatch("Hint block ", 1)
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_TileEntity_MegaChemicalReactor(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[] { 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 supportsSingleRecipeLocking() {
- return true;
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return RecipeMaps.multiblockChemicalReactorRecipes;
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
- this.batchMode = aNBT.getBoolean("mUseMultiparallelMode");
- }
- }
-
- @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 boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
- float aX, float aY, float aZ) {
- if (aPlayer.isSneaking()) {
- this.batchMode = !this.batchMode;
- if (this.batchMode) {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- return false;
- }
-
- @Override
- protected ProcessingLogic createProcessingLogic() {
- return new ProcessingLogic().enablePerfectOverclock()
- .setMaxParallel(ConfigHandler.megaMachinesMax);
- }
-
- @Override
- public void construct(ItemStack aStack, boolean aHintsOnly) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 2, 2, 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
- if (this.mMachine) return -1;
- int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
- return this
- .survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 2, 0, realBudget, source, actor, false, true);
- }
- // -------------- TEC TECH COMPAT ----------------
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
- this.glassTier = 0;
-
- if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 2, 2, 0) || this.mMaintenanceHatches.size() != 1) return false;
-
- if (this.glassTier < 8) {
- for (int i = 0; i < this.mExoticEnergyHatches.size(); ++i) {
- GT_MetaTileEntity_Hatch hatch = this.mExoticEnergyHatches.get(i);
- if (hatch.getConnectionType() == GT_MetaTileEntity_Hatch.ConnectionType.LASER) {
- return false;
- }
- if (this.glassTier < hatch.mTier) {
- return false;
- }
- }
- for (int i = 0; i < this.mEnergyHatches.size(); ++i) {
- if (this.glassTier < this.mEnergyHatches.get(i).mTier) {
- return false;
- }
- }
- }
-
- return true;
- }
-
- private static final int CASING_INDEX = 176;
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_MegaChemicalReactor> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_MegaChemicalReactor>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] { { "ttttt", "dptpd", "dptpd", "dptpd", "dptpd", "dptpd", "dptpd", "dptpd", "ttttt" },
- { "tgggt", " ggg ", " ggg ", " ggg ", " ggg ", " ggg ", " ggg ", " ggg ", "teeet" },
- { "tg~gt", " gcg ", " gcg ", " gcg ", " gcg ", " gcg ", " gcg ", " gcg ", "teret" },
- { "tgggt", " ggg ", " ggg ", " ggg ", " ggg ", " ggg ", " ggg ", " ggg ", "teeet" },
- { "ttttt", "dptpd", "dptpd", "dptpd", "dptpd", "dptpd", "dptpd", "dptpd", "ttttt" }, }))
- .addElement('p', ofBlock(GregTech_API.sBlockCasings8, 1))
- .addElement('t', ofBlock(GregTech_API.sBlockCasings8, 0))
- .addElement(
- 'd',
- buildHatchAdder(GT_TileEntity_MegaChemicalReactor.class)
- .atLeast(InputBus, InputHatch, OutputBus, OutputHatch)
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(GregTech_API.sBlockCasings8, 0))
- .addElement('r', Maintenance.newAny(CASING_INDEX, 2))
- .addElement(
- 'e',
- buildHatchAdder(GT_TileEntity_MegaChemicalReactor.class)
- .atLeast(Energy.or(ExoticEnergy), InputHatch, InputBus, OutputHatch, OutputBus)
- .casingIndex(CASING_INDEX)
- .dot(3)
- .buildAndChain(GregTech_API.sBlockCasings8, 0))
- .addElement('c', ofChain(ofBlock(GregTech_API.sBlockCasings4, 7), ofBlock(GregTech_API.sBlockCasings5, 13)))
- .addElement(
- 'g',
- BorosilicateGlass
- .ofBoroGlass((byte) 0, (byte) 1, Byte.MAX_VALUE, (te, t) -> te.glassTier = t, te -> te.glassTier))
- .build();
-
- @Override
- public IStructureDefinition<GT_TileEntity_MegaChemicalReactor> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- public boolean supportsBatchMode() {
- return true;
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-
- @Override
- public boolean supportsInputSeparation() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java
deleted file mode 100644
index 80bc644e9e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS;
-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.*;
-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 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.tileentity.TileEntity;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
-import com.gtnewhorizon.structurelib.structure.IItemSource;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.IStructureElementCheckOnly;
-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.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_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.api.util.GT_Utility;
-import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
-
-public class GT_TileEntity_MegaDistillTower extends GT_TileEntity_MegaMultiBlockBase<GT_TileEntity_MegaDistillTower>
- 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_TOP_HINT = "top";
- private static final IStructureDefinition<GT_TileEntity_MegaDistillTower> STRUCTURE_DEFINITION;
-
- static {
- IHatchElement<GT_TileEntity_MegaDistillTower> layeredOutputHatch = OutputHatch
- .withCount(GT_TileEntity_MegaDistillTower::getCurrentLayerOutputHatchCount)
- .withAdder(GT_TileEntity_MegaDistillTower::addLayerOutputHatch);
- STRUCTURE_DEFINITION = StructureDefinition.<GT_TileEntity_MegaDistillTower>builder()
- .addShape(
- STRUCTURE_PIECE_BASE,
- transpose(
- new String[][] { { "bbbbbbb~bbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb",
- "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb",
- "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbb",
- "bbbbbbbbbbbbbbb" }, }))
- .addShape(
- STRUCTURE_PIECE_LAYER,
- transpose(
- new String[][] {
- { "lllllllllllllll", "lcccccccccccccl", "lcccccccccccccl", "lcccccccccccccl", "lcccccccccccccl",
- "lcccccccccccccl", "lcccccccccccccl", "lcccccccccccccl", "lcccccccccccccl",
- "lcccccccccccccl", "lcccccccccccccl", "lcccccccccccccl", "lcccccccccccccl",
- "lcccccccccccccl", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" }, }))
- .addShape(
- STRUCTURE_PIECE_TOP_HINT,
- transpose(
- new String[][] {
- { "lllllllllllllll", "lllllllllllllll", "lllllllllllllll", "lllllllllllllll", "lllllllllllllll",
- "lllllllllllllll", "lllllllllllllll", "lllllllllllllll", "lllllllllllllll",
- "lllllllllllllll", "lllllllllllllll", "lllllllllllllll", "lllllllllllllll",
- "lllllllllllllll", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" },
- { "lllllllllllllll", "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "l=============l", "l=============l", "l=============l",
- "l=============l", "lllllllllllllll" }, }))
- .addElement('=', StructureElementAirNoHint.getInstance())
- .addElement(
- 'b',
- buildHatchAdder(GT_TileEntity_MegaDistillTower.class)
- .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy.or(ExoticEnergy))
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(
- onElementPass(
- GT_TileEntity_MegaDistillTower::onCasingFound,
- ofBlock(GregTech_API.sBlockCasings4, 1))))
- .addElement(
- 'l',
- buildHatchAdder(GT_TileEntity_MegaDistillTower.class)
- .atLeast(layeredOutputHatch, Maintenance, Energy.or(ExoticEnergy))
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(
- onElementPass(
- GT_TileEntity_MegaDistillTower::onCasingFound,
- ofBlock(GregTech_API.sBlockCasings4, 1))))
- .addElement('c', (IStructureElementCheckOnly<GT_TileEntity_MegaDistillTower>) (t, world, x, y, z) -> {
- if (world.isAirBlock(x, y, z)) {
- if (t.mTopState < 1) {
- t.mTopState = 0;
- return true;
- }
- // definitely top - cannot be air
- return false;
- }
- // from here on we must be looking at a top layer, since it's not air
- if (t.mTopState == 0)
- // must be air but failed, so no
- return false;
- t.mTopState = 1;
- // hatch adder
- TileEntity tileEntity = world.getTileEntity(x, y, z);
- if (tileEntity instanceof IGregTechTileEntity entity && t.addLayerOutputHatch(entity, CASING_INDEX)) {
- t.onTopLayerFound(false);
- return true;
- }
- // block adder
- if (world.getBlock(x, y, z) == GregTech_API.sBlockCasings4 && world.getBlockMetadata(x, y, z) == 1) {
- t.onTopLayerFound(true);
- return true;
- }
- return false;
- })
- .build();
- }
-
- protected final List<List<GT_MetaTileEntity_Hatch_Output>> mOutputHatchesByLayer = new ArrayList<>();
- protected int mHeight;
- protected int mCasing;
- protected boolean mTopLayerFound;
-
- // -1 => maybe top, maybe not, 0 => definitely not top, 1 => definitely top
- private int mTopState = -1;
-
- public GT_TileEntity_MegaDistillTower(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- private GT_TileEntity_MegaDistillTower(String aName) {
- super(aName);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_TileEntity_MegaDistillTower(this.mName);
- }
-
- protected void onCasingFound() {
- this.mCasing++;
- }
-
- protected int getCurrentLayerOutputHatchCount() {
- return this.mOutputHatchesByLayer.size() < this.mHeight || this.mHeight <= 0 ? 0
- : this.mOutputHatchesByLayer.get(this.mHeight - 1)
- .size();
- }
-
- protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
- if (aTileEntity == null || aTileEntity.isDead()
- || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output)) return false;
- while (this.mOutputHatchesByLayer.size() < this.mHeight) this.mOutputHatchesByLayer.add(new ArrayList<>());
- GT_MetaTileEntity_Hatch_Output tHatch = (GT_MetaTileEntity_Hatch_Output) aTileEntity.getMetaTileEntity();
- tHatch.updateTexture(aBaseCasingIndex);
- return this.mOutputHatchesByLayer.get(this.mHeight - 1)
- .add(tHatch);
- }
-
- protected void onTopLayerFound(boolean aIsCasing) {
- this.mTopLayerFound = true;
- if (aIsCasing) this.onCasingFound();
- }
-
- @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(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[] { Textures.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 int getRecipeCatalystPriority() {
- return -1;
- }
-
- @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(15, 15, 16, 56, 15, 15, true)
- .addController("Front bottom")
- .addOtherStructurePart("Clean Stainless Steel Machine Casing", "15 x h - 5 (minimum)")
- .addEnergyHatch("Any casing")
- .addMaintenanceHatch("Any casing")
- .addInputHatch("Any bottom layer casing")
- .addOutputBus("Any bottom layer casing")
- .addOutputHatch("2-11x Output Hatches (One per Output Layer except bottom layer)")
- .addStructureInfo("An \"Output Layer\" consists of 5 layers!")
- .addStructureHint("The interior of this Mega Multiblock's hologram is empty, it should be all air.")
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS);
- return tt;
- }
-
- @Override
- public IStructureDefinition<GT_TileEntity_MegaDistillTower> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
- // reset
- this.mOutputHatchesByLayer.forEach(List::clear);
- this.mHeight = 1;
- this.mTopLayerFound = false;
- this.mTopState = -1;
-
- // check base
- if (!this.checkPiece(STRUCTURE_PIECE_BASE, 7, 0, 0)) return false;
-
- // check each layer
- while (this.mHeight < 12) {
- if (!checkPiece(STRUCTURE_PIECE_LAYER, 7, mHeight * 5, 0)) {
- return false;
- }
- if (this.mOutputHatchesByLayer.size() < this.mHeight || this.mOutputHatchesByLayer.get(this.mHeight - 1)
- .isEmpty())
- // layer without output hatch
- return false;
- if (mTopLayerFound) {
- break;
- }
- this.mTopState = -1;
- // not top
- this.mHeight++;
- }
-
- // validate final invariants...
- return this.mCasing >= 75 * this.mHeight + 10 && this.mHeight >= 2
- && this.mTopLayerFound
- && this.mMaintenanceHatches.size() == 1;
- }
-
- @Override
- public void construct(ItemStack stackSize, boolean hintsOnly) {
- this.buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 7, 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++) {
- this.buildPiece(STRUCTURE_PIECE_LAYER, stackSize, hintsOnly, 7, 5 * i, 0);
- }
- this.buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 7, 5 * (tTotalHeight - 1), 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
- if (this.mMachine) return -1;
- int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
- this.mHeight = 0;
- int built = this
- .survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 7, 0, 0, realBudget, source, actor, 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++) {
- this.mHeight = i;
- built = this.survivialBuildPiece(
- STRUCTURE_PIECE_LAYER,
- stackSize,
- 7,
- 5 * this.mHeight,
- 0,
- realBudget,
- source,
- actor,
- false,
- true);
- if (built >= 0) return built;
- }
- this.mHeight = tTotalHeight - 1;
- return this.survivialBuildPiece(
- STRUCTURE_PIECE_TOP_HINT,
- stackSize,
- 7,
- 5 * this.mHeight,
- 0,
- realBudget,
- source,
- actor,
- false,
- true);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
- this.batchMode = aNBT.getBoolean("mUseMultiparallelMode");
- }
- }
-
- @Override
- public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
- float aX, float aY, float aZ) {
- if (aPlayer.isSneaking()) {
- this.batchMode = !this.batchMode;
- if (this.batchMode) {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- return false;
- }
-
- @Override
- protected ProcessingLogic createProcessingLogic() {
- return new ProcessingLogic().setMaxParallel(ConfigHandler.megaMachinesMax);
- }
-
- @Override
- public boolean canDumpFluidToME() {
-
- // All fluids can be dumped to ME only if each layer contains a ME Output Hatch.
- for (List<GT_MetaTileEntity_Hatch_Output> tLayerOutputHatches : this.mOutputHatchesByLayer) {
-
- boolean foundMEHatch = false;
-
- for (IFluidStore tHatch : tLayerOutputHatches) {
- if (tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME) {
- foundMEHatch = true;
- break;
- }
- }
-
- // Exit if we didn't find a valid hatch on this layer.
- if (!foundMEHatch) {
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
- for (int i = 0; i < mOutputFluids2.length && i < this.mOutputHatchesByLayer.size(); i++) {
- FluidStack tStack = mOutputFluids2[i].copy();
- if (!dumpFluid(this.mOutputHatchesByLayer.get(i), tStack, true))
- dumpFluid(this.mOutputHatchesByLayer.get(i), tStack, false);
- }
- }
-
- @Override
- public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
- return this.getFluidOutputSlotsByLayer(toOutput, this.mOutputHatchesByLayer);
- }
-
- @Override
- public boolean supportsBatchMode() {
- return true;
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java
deleted file mode 100644
index 223ef65f77..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java
+++ /dev/null
@@ -1,223 +0,0 @@
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega;
-
-import static gregtech.api.util.GT_Utility.filterValidMTEs;
-
-import java.util.Arrays;
-
-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.World;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.gtnewhorizon.structurelib.StructureLibAPI;
-import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
-import com.gtnewhorizon.structurelib.structure.IStructureElement;
-
-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.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
-import gregtech.api.util.GT_Utility;
-
-public abstract class GT_TileEntity_MegaMultiBlockBase<T extends GT_TileEntity_MegaMultiBlockBase<T>>
- extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T> {
-
- protected GT_TileEntity_MegaMultiBlockBase(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_MegaMultiBlockBase(String aName) {
- super(aName);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- // Migration code
- if (aNBT.hasKey("lEUt")) {
- this.lEUt = aNBT.getLong("lEUt");
- }
- }
-
- protected String[] getExtendedInfoData() {
- return new String[0];
- }
-
- protected long[] getCurrentInfoData() {
- long storedEnergy = 0, maxEnergy = 0;
- for (GT_MetaTileEntity_Hatch hatch : this.getExoticAndNormalEnergyHatchList()) {
- storedEnergy += hatch.getBaseMetaTileEntity()
- .getStoredEU();
- maxEnergy += hatch.getBaseMetaTileEntity()
- .getEUCapacity();
- }
- return new long[] { storedEnergy, maxEnergy };
- }
-
- @Override
- public String[] getInfoData() {
- int mPollutionReduction = 0;
-
- for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
- mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
- }
-
- long[] ttHatches = this.getCurrentInfoData();
- long storedEnergy = ttHatches[0];
- long maxEnergy = ttHatches[1];
-
- for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
- storedEnergy += tHatch.getBaseMetaTileEntity()
- .getStoredEU();
- maxEnergy += tHatch.getBaseMetaTileEntity()
- .getEUCapacity();
- }
-
- long nominalV = this.getMaxInputEu();
- String tName = BW_Util.getTierNameFromVoltage(nominalV);
- if ("MAX+".equals(tName)) tName = EnumChatFormatting.OBFUSCATED + "MAX+";
-
- String[] extendedInfo = this.getExtendedInfoData();
-
- String[] baseInfo = {
- StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
- + EnumChatFormatting.GREEN
- + GT_Utility.formatNumbers(this.mProgresstime / 20)
- + EnumChatFormatting.RESET
- + " s / "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(this.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(-this.lEUt)
- + EnumChatFormatting.RESET
- + " EU/t",
- StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(this.getMaxInputVoltage())
- + EnumChatFormatting.RESET
- + " EU/t(*"
- + GT_Utility.formatNumbers(this.getMaxInputAmps())
- + "A) = "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(nominalV)
- + EnumChatFormatting.RESET,
- StatCollector.translateToLocal("GT5U.machines.tier") + ": "
- + EnumChatFormatting.YELLOW
- + tName
- + EnumChatFormatting.RESET,
- StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
- + EnumChatFormatting.RED
- + (this.getIdealStatus() - this.getRepairStatus())
- + EnumChatFormatting.RESET
- + " "
- + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
- + ": "
- + EnumChatFormatting.YELLOW
- + this.mEfficiency / 100.0F
- + EnumChatFormatting.RESET
- + " %",
- StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
- + EnumChatFormatting.GREEN
- + mPollutionReduction
- + EnumChatFormatting.RESET
- + " %" };
-
- String[] combinedInfo = Arrays.copyOf(baseInfo, baseInfo.length + extendedInfo.length + 1);
-
- System.arraycopy(extendedInfo, 0, combinedInfo, baseInfo.length, extendedInfo.length);
-
- combinedInfo[combinedInfo.length - 1] = BW_Tooltip_Reference.BW;
-
- return combinedInfo;
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return true;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 10000;
- }
-
- @Override
- protected void setProcessingLogicPower(ProcessingLogic logic) {
- logic.setAvailableVoltage(this.getMaxInputEu());
- logic.setAvailableAmperage(1);
- }
-
- protected static class StructureElementAirNoHint<T> implements IStructureElement<T> {
-
- private static final StructureElementAirNoHint<?> INSTANCE = new StructureElementAirNoHint<>();
-
- @SuppressWarnings("unchecked")
- public static <T> IStructureElement<T> getInstance() {
- return (IStructureElement<T>) INSTANCE;
- }
-
- private StructureElementAirNoHint() {}
-
- @Override
- public boolean check(T o, World world, int x, int y, int z) {
- return world.isAirBlock(x, y, z);
- }
-
- @Override
- public boolean spawnHint(T o, World world, int x, int y, int z, ItemStack trigger) {
- if (world.blockExists(x, y, z) && !world.isAirBlock(x, y, z))
- // hint if this is obstructed. in case *someone* ever finish the transparent rendering
- StructureLibAPI
- .hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), StructureLibAPI.HINT_BLOCK_META_AIR);
- return true;
- }
-
- @Override
- public boolean placeBlock(T o, World world, int x, int y, int z, ItemStack trigger) {
- world.setBlockToAir(x, y, z);
- return true;
- }
-
- @Override
- public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
- AutoPlaceEnvironment env) {
- return BlocksToPlace.createEmpty();
- }
-
- @Override
- public PlaceResult survivalPlaceBlock(T o, World world, int x, int y, int z, ItemStack trigger,
- AutoPlaceEnvironment env) {
- if (this.check(o, world, x, y, z)) return PlaceResult.SKIP;
- if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return PlaceResult.REJECT;
- world.setBlock(x, y, z, Blocks.air, 0, 2);
- return PlaceResult.ACCEPT;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java
deleted file mode 100644
index 40ec9f814b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * Copyright (c) 2022 SKYCATV587 Permission is hereby granted, free of charge, to any person obtaining a copy of this
- * software and associated documentation files (the "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
- * Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The
- * above copyright notice and this permission notice shall be included in all copies or substantial portions of the
- * Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
-import static gregtech.api.enums.GT_HatchElement.*;
-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.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
-import com.gtnewhorizon.structurelib.structure.IItemSource;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-
-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.logic.ProcessingLogic;
-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_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.api.util.GT_Utility;
-import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
-import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch;
-
-public class GT_TileEntity_MegaOilCracker extends GT_TileEntity_MegaMultiBlockBase<GT_TileEntity_MegaOilCracker>
- implements ISurvivalConstructable {
-
- private static final int CASING_INDEX = 49;
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_MegaOilCracker> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_MegaOilCracker>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] {
- { " p p ", "ppgggggggggpp", " pgggggggggp ", " pgggpppgggp ", " pgggpMpgggp ",
- " pgggpppgggp ", " pgggggggggp ", "ppgggggggggpp", " p p " },
- { " p p ", "pgggggggggggp", " g c c c c g ", " g c c c c g ", " g c c c c g ",
- " g c c c c g ", " g c c c c g ", "pgggggggggggp", " p p " },
- { " p p ", "pgggggggggggp", " g c c c c g ", " p c c p ", " p c c c c p ",
- " p c c p ", " g c c c c g ", "pgggggggggggp", " p p " },
- { " p p ", "pgggggggggggp", " g c c c c g ", " p c c c c p ", " l c c c c r ",
- " p c c c c p ", " g c c c c g ", "pgggggggggggp", " p p " },
- { " p p ", "pgggggggggggp", " g c c c c g ", " p c c p ", " p c c c c p ",
- " p c c p ", " g c c c c g ", "pgggggggggggp", " p p " },
- { " p p ", "pgggggggggggp", " g c c c c g ", " g c c c c g ", " g c c c c g ",
- " g c c c c g ", " g c c c c g ", "pgggggggggggp", " p p " },
- { "ppmmmm~mmmmpp", "ppppppppppppp", "ppppppppppppp", "ppppppppppppp", "ppppppppppppp",
- "ppppppppppppp", "ppppppppppppp", "ppppppppppppp", "ppmmmmmmmmmpp" }, }))
- .addElement(
- 'c',
- withChannel(
- "coil",
- ofCoil(GT_TileEntity_MegaOilCracker::setCoilLevel, GT_TileEntity_MegaOilCracker::getCoilLevel)))
-
- .addElement('p', ofBlock(GregTech_API.sBlockCasings4, 1))
- .addElement(
- 'l',
- InputHatch.withAdder(GT_TileEntity_MegaOilCracker::addLeftHatchToMachineList)
- .newAny(CASING_INDEX, 2))
- .addElement(
- 'r',
- OutputHatch.withAdder(GT_TileEntity_MegaOilCracker::addRightHatchToMachineList)
- .newAny(CASING_INDEX, 3))
- .addElement(
- 'm',
- buildHatchAdder(GT_TileEntity_MegaOilCracker.class).atLeast(Energy.or(ExoticEnergy), Maintenance, InputBus)
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(GregTech_API.sBlockCasings4, 1))
- .addElement(
- 'M',
- InputHatch.withAdder(GT_TileEntity_MegaOilCracker::addMiddleInputToMachineList)
- .newAny(CASING_INDEX, 4))
- .addElement(
- 'g',
- withChannel(
- "glass",
- BorosilicateGlass
- .ofBoroGlass((byte) 0, (byte) 1, Byte.MAX_VALUE, (te, t) -> te.glassTier = t, te -> te.glassTier)))
- .build();
- private byte glassTier;
- private HeatingCoilLevel heatLevel;
- protected final List<GT_MetaTileEntity_Hatch_Input> mMiddleInputHatches = new ArrayList<>();
- protected int mInputOnSide = -1;
- protected int mOutputOnSide = -1;
-
- public GT_TileEntity_MegaOilCracker(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_MegaOilCracker(String aName) {
- super(aName);
- }
-
- @Override
- public GT_Multiblock_Tooltip_Builder createTooltip() {
- final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Cracker")
- .addInfo("Controller block for the Mega Oil Cracking")
- .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(13, 7, 9, true)
- .addController("Front bottom")
- .addStructureInfo("The glass tier limits the Energy Input tier")
- .addInfo("Gets 10% EU/t reduction per coil tier, up to a maximum of 50%")
- .addEnergyHatch("Hint block", 1)
- .addMaintenanceHatch("Hint block", 1)
- .addInputHatch("Hint block", 2, 3)
- .addOutputHatch("Hint block", 2, 3)
- .addInputHatch("Steam/Hydrogen ONLY, Hint block", 4)
- .addInputBus("Optional, for programmed circuit automation. Hint block", 1)
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_TileEntity_MegaOilCracker(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[] { 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() {
-
- @Override
- @Nonnull
- public CheckRecipeResult process() {
- this.setEuModifier(
- 1.0F - Math.min(0.1F * (GT_TileEntity_MegaOilCracker.this.heatLevel.getTier() + 1), 0.5F));
- return super.process();
- }
- }.setMaxParallel(ConfigHandler.megaMachinesMax);
- }
-
- public HeatingCoilLevel getCoilLevel() {
- return this.heatLevel;
- }
-
- public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
- this.heatLevel = aCoilLevel;
- }
-
- @Override
- public void construct(ItemStack aStack, boolean aHintsOnly) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 6, 6, 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
- if (this.mMachine) return -1;
- int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
- return this
- .survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 6, 6, 0, realBudget, source, actor, false, true);
- }
- // -------------- TEC TECH COMPAT ----------------
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
- this.glassTier = 0;
- this.mInputOnSide = -1;
- this.mOutputOnSide = -1;
- this.mMiddleInputHatches.clear();
-
- if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 6, 6, 0) || this.mMaintenanceHatches.size() != 1) return false;
-
- if (this.glassTier < 8) {
- for (int i = 0; i < this.mExoticEnergyHatches.size(); ++i) {
- GT_MetaTileEntity_Hatch hatch = this.mExoticEnergyHatches.get(i);
- if (hatch.getConnectionType() == GT_MetaTileEntity_Hatch.ConnectionType.LASER) {
- return false;
- }
- if (this.glassTier < hatch.mTier) {
- return false;
- }
- }
- for (int i = 0; i < this.mEnergyHatches.size(); ++i) {
- if (this.glassTier < this.mEnergyHatches.get(i).mTier) {
- return false;
- }
- }
- }
-
- return true;
- }
-
- 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) {
- if (this.mInputOnSide == 1) {
- return false;
- }
- this.mInputOnSide = 0;
- this.mOutputOnSide = 1;
- GT_MetaTileEntity_Hatch_Input tHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
- tHatch.updateTexture(aBaseCasingIndex);
- tHatch.mRecipeMap = this.getRecipeMap();
- return this.mInputHatches.add(tHatch);
- }
- if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
- if (this.mOutputOnSide == 1) {
- return false;
- }
- this.mInputOnSide = 1;
- this.mOutputOnSide = 0;
- GT_MetaTileEntity_Hatch_Output tHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity;
- tHatch.updateTexture(aBaseCasingIndex);
- return this.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) {
- if (this.mInputOnSide == 0) {
- return false;
- }
- this.mInputOnSide = 1;
- this.mOutputOnSide = 0;
- GT_MetaTileEntity_Hatch_Input tHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
- tHatch.updateTexture(aBaseCasingIndex);
- tHatch.mRecipeMap = this.getRecipeMap();
- return this.mInputHatches.add(tHatch);
- }
- if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
- if (this.mOutputOnSide == 0) {
- return false;
- }
- this.mInputOnSide = 0;
- this.mOutputOnSide = 1;
- GT_MetaTileEntity_Hatch_Output tHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity;
- tHatch.updateTexture(aBaseCasingIndex);
- return this.mOutputHatches.add(tHatch);
- }
- return false;
- }
-
- 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 = this.getRecipeMap();
- return this.mMiddleInputHatches.add(tHatch);
- }
- return false;
- }
-
- @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 IStructureDefinition<GT_TileEntity_MegaOilCracker> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @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, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- return false;
- }
-
- @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/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java
deleted file mode 100644
index 0a2464de5e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.multis.mega;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTWORKS;
-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.*;
-import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
-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 static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
-
-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.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
-import com.gtnewhorizon.structurelib.structure.IItemSource;
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-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.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_Utility;
-
-public class GT_TileEntity_MegaVacuumFreezer extends GT_TileEntity_MegaMultiBlockBase<GT_TileEntity_MegaVacuumFreezer>
- implements ISurvivalConstructable {
-
- public GT_TileEntity_MegaVacuumFreezer(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_TileEntity_MegaVacuumFreezer(String aName) {
- super(aName);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_TileEntity_MegaVacuumFreezer(this.mName);
- }
-
- private int mCasing = 0;
-
- private static final int CASING_INDEX = 17;
- private static final String STRUCTURE_PIECE_MAIN = "main";
- private static final IStructureDefinition<GT_TileEntity_MegaVacuumFreezer> STRUCTURE_DEFINITION = StructureDefinition
- .<GT_TileEntity_MegaVacuumFreezer>builder()
- .addShape(
- STRUCTURE_PIECE_MAIN,
- transpose(
- new String[][] {
- { "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc",
- "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc",
- "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccc~ccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "c=============c",
- "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" },
- { "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc",
- "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc",
- "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc",
- "ccccccccccccccc" } }))
- .addElement('=', StructureElementAirNoHint.getInstance())
- .addElement(
- 'c',
- buildHatchAdder(GT_TileEntity_MegaVacuumFreezer.class)
- .atLeast(Energy.or(ExoticEnergy), InputHatch, InputBus, OutputHatch, OutputBus, Maintenance)
- .casingIndex(CASING_INDEX)
- .dot(1)
- .buildAndChain(onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 1))))
- .build();
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Vacuum Freezer")
- .addInfo("Controller Block for the Mega Vacuum Freezer")
- .addInfo("Cools hot ingots and cells")
- .addSeparator()
- .beginStructureBlock(15, 15, 15, true)
- .addController("Front center")
- .addCasingInfoMin("Frost Proof Machine Casing", 900, 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(MULTIBLOCK_ADDED_BY_BARTWORKS);
- return tt;
- }
-
- @Override
- public IStructureDefinition<GT_TileEntity_MegaVacuumFreezer> getStructureDefinition() {
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- public void construct(ItemStack aStack, boolean aHintsOnly) {
- this.buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 7, 7, 0);
- }
-
- @Override
- public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
- if (this.mMachine) return -1;
- int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
- return this
- .survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 7, 0, realBudget, source, actor, false, true);
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return RecipeMaps.vacuumFreezerRecipes;
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
- this.batchMode = aNBT.getBoolean("mUseMultiparallelMode");
- }
- }
-
- @Override
- public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
- float aX, float aY, float aZ) {
- if (aPlayer.isSneaking()) {
- this.batchMode = !this.batchMode;
- if (this.batchMode) {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
- } else {
- GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
- }
- return true;
- }
- return false;
- }
-
- @Override
- protected ProcessingLogic createProcessingLogic() {
- return new ProcessingLogic().setMaxParallel(ConfigHandler.megaMachinesMax);
- }
-
- // -------------- TEC TECH COMPAT ----------------
-
- @Override
- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
- this.mCasing = 0;
- if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 7, 7, 0)) return false;
- return this.mMaintenanceHatches.size() == 1 && this.mCasing >= 900;
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
- int aColorIndex, boolean aActive, boolean aRedstone) {
- ITexture[] rTexture;
- if (side == facing) {
- 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 boolean supportsBatchMode() {
- return true;
- }
-
- @Override
- public boolean supportsVoidProtection() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java
deleted file mode 100644
index c50e6cbd12..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-
-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.implementations.GT_MetaTileEntity_BasicGenerator;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.render.TextureFactory;
-
-public class GT_MetaTileEntity_AcidGenerator extends GT_MetaTileEntity_BasicGenerator {
-
- public GT_MetaTileEntity_AcidGenerator(int aID, String aName, String aNameRegional, int aTier,
- ITexture... aTextures) {
- super(aID, aName, aNameRegional, aTier, new String[] {}, aTextures);
- }
-
- public GT_MetaTileEntity_AcidGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- @Override
- public int getPollution() {
- return 0;
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return BartWorksRecipeMaps.acidGenFuels;
- }
-
- @Override
- public int getEfficiency() {
- return 100 - 3 * this.mTier;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_MetaTileEntity_AcidGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
- }
-
- @Override
- public ITexture[] getFront(byte aColor) {
- return new ITexture[] { super.getFront(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL),
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
- }
-
- @Override
- public ITexture[] getBack(byte aColor) {
- return new ITexture[] { super.getBack(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD) };
- }
-
- @Override
- public ITexture[] getBottom(byte aColor) {
- return new ITexture[] { super.getBottom(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD) };
- }
-
- @Override
- public ITexture[] getTop(byte aColor) {
- return new ITexture[] { super.getTop(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL),
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT_GLOW"))
- .glow()
- .build() };
- }
-
- @Override
- public ITexture[] getSides(byte aColor) {
- return new ITexture[] { super.getSides(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD) };
- }
-
- @Override
- public ITexture[] getFrontActive(byte aColor) {
- return new ITexture[] { super.getFrontActive(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL),
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
- }
-
- @Override
- public ITexture[] getBackActive(byte aColor) {
- return new ITexture[] { super.getBackActive(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD) };
- }
-
- @Override
- public ITexture[] getBottomActive(byte aColor) {
- return new ITexture[] { super.getBottomActive(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD) };
- }
-
- @Override
- public ITexture[] getTopActive(byte aColor) {
- return new ITexture[] { super.getTopActive(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL),
- TextureFactory
- .of(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE_GLOW"))
- .glow()
- .build() };
- }
-
- @Override
- public ITexture[] getSidesActive(byte aColor) {
- return new ITexture[] { super.getSidesActive(aColor)[0],
- TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD) };
- }
-
- @Override
- public boolean isOutputFacing(ForgeDirection side) {
- return side == this.getBaseMetaTileEntity()
- .getFrontFacing();
- }
-
- @Override
- public String[] getDescription() {
- return new String[] { StatCollector.translateToLocal("tooltip.tile.acidgen.0.name"),
- StatCollector.translateToLocal("tooltip.tile.acidgen.1.name"),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.0.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Values.V[this.mTier],
- StatCollector.translateToLocal("tooltip.rotor.2.name") + " "
- + ChatColorHelper.YELLOW
- + this.getEfficiency(),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.2.name") + " "
- + ChatColorHelper.YELLOW
- + this.maxAmperesOut(),
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get() };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java
deleted file mode 100644
index d2ef329066..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import static gregtech.api.enums.Mods.Gendustry;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.common.items.LabModule;
-import com.github.bartimaeusnek.bartworks.common.items.LabParts;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioCultureLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.BioDNA;
-import com.github.bartimaeusnek.bartworks.util.BioData;
-import com.github.bartimaeusnek.bartworks.util.BioPlasmid;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-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_BasicMachine;
-import gregtech.api.objects.XSTR;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.items.behaviors.Behaviour_DataOrb;
-
-public class GT_MetaTileEntity_BioLab extends GT_MetaTileEntity_BasicMachine {
-
- private static final int DNA_EXTRACTION_MODULE = 0;
- private static final int PCR_THERMOCYCLE_MODULE = 1;
- private static final int PLASMID_SYNTHESIS_MODULE = 2;
- private static final int TRANSFORMATION_MODULE = 3;
- private static final int CLONAL_CELLULAR_SYNTHESIS_MODULE = 4;
- private static final int INCUBATION_MODULE = 5;
-
- public GT_MetaTileEntity_BioLab(int aID, String aName, String aNameRegional, int aTier) {
- super(
- aID,
- aName,
- aNameRegional,
- aTier,
- 1,
- (String) null,
- 6,
- 2,
- TextureFactory.of(
- TextureFactory
- .of(new Textures.BlockIcons.CustomIcon("basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE")),
- TextureFactory.builder()
- .addIcon(
- new Textures.BlockIcons.CustomIcon("basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE_GLOW"))
- .glow()
- .build()),
- TextureFactory.of(
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/fluid_extractor/OVERLAY_SIDE")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/fluid_extractor/OVERLAY_SIDE_GLOW"))
- .glow()
- .build()),
- TextureFactory.of(
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/microwave/OVERLAY_FRONT_ACTIVE")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/microwave/OVERLAY_FRONT_ACTIVE_GLOW"))
- .glow()
- .build()),
- TextureFactory.of(
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/microwave/OVERLAY_FRONT")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/microwave/OVERLAY_FRONT_GLOW"))
- .glow()
- .build()),
- TextureFactory.of(
- TextureFactory
- .of(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE")),
- TextureFactory.builder()
- .addIcon(
- new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE_GLOW"))
- .glow()
- .build() /* this is topactive */),
- TextureFactory.of(
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/chemical_reactor/OVERLAY_FRONT_GLOW"))
- .glow()
- .build() /* this is top */),
- TextureFactory.of(
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE_GLOW"))
- .glow()
- .build()),
- TextureFactory.of(
- TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/polarizer/OVERLAY_BOTTOM")),
- TextureFactory.builder()
- .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/polarizer/OVERLAY_BOTTOM_GLOW"))
- .glow()
- .build()));
- }
-
- public GT_MetaTileEntity_BioLab(String aName, int aTier, int aAmperage, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aAmperage, aDescription, aTextures, 6, 2);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_MetaTileEntity_BioLab(
- this.mName,
- this.mTier,
- this.mAmperage,
- this.mDescriptionArray,
- this.mTextures);
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return BartWorksRecipeMaps.bioLabRecipes;
- }
-
- @Override
- public int getCapacity() {
- return this.mTier * 1000;
- }
-
- @Override
- public int checkRecipe(boolean skipOC) {
-
- int rTier = 3;
- FluidStack dnaFluid = Gendustry.isModLoaded() ? FluidRegistry.getFluidStack("liquiddna", 1000)
- : Materials.Biomass.getFluid(1000L);
-
- if (this.getSpecialSlot() != null && this.getSpecialSlot()
- .getItem() instanceof LabModule) {
- int damage = this.getSpecialSlot()
- .getItemDamage();
- switch (damage) {
- case DNA_EXTRACTION_MODULE:
- if (GT_Utility.isStackValid(this.mInventory[this.getInputSlot()])
- && this.mInventory[this.getInputSlot()].getItem() instanceof LabParts
- && this.mInventory[this.getInputSlot()].getItemDamage() == 0
- && this.mInventory[this.getInputSlot()].getTagCompound() != null
- && // checks if it is a Culture
- GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 1])
- && this.mInventory[this.getInputSlot() + 1].getItem() instanceof LabParts
- && this.mInventory[this.getInputSlot() + 1].getItemDamage() == 1
- && this.mInventory[this.getInputSlot() + 1].getTagCompound() == null
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 2])
- && this.mInventory[this.getInputSlot() + 2].getItem() instanceof LabParts
- && this.mInventory[this.getInputSlot() + 2].getItemDamage() == 3
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot() + 3], Materials.Ethanol.getCells(1))
- && this.mFluid != null
- && this.mFluid.isFluidEqual(FluidRegistry.getFluidStack("ic2distilledwater", 1000))
- && this.mFluid.amount >= 1000) {
-
- NBTTagCompound DNABioDataTag = this.mInventory[this.getInputSlot()].getTagCompound()
- .getCompoundTag("DNA");
- if (DNABioDataTag == null) return super.checkRecipe(skipOC);
- BioData cultureDNABioData = BioData.getBioDataFromName(
- this.mInventory[this.getInputSlot()].getTagCompound()
- .getCompoundTag("DNA")
- .getString("Name"));
- if (cultureDNABioData == null) return super.checkRecipe(skipOC);
-
- if (this.mTier < rTier + cultureDNABioData.getTier())
- return GT_MetaTileEntity_BasicMachine.FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
-
- for (int i = 0; i < 4; i++) {
- if (this.mInventory[this.getInputSlot() + i] != null)
- this.mInventory[this.getInputSlot() + i].stackSize--;
- }
-
- this.mFluid.amount -= 1000;
-
- if (cultureDNABioData.getChance() > new XSTR().nextInt(10000)) {
- this.mOutputItems[0] = BioItemList
- .getDNASampleFlask(BioDNA.convertDataToDNA(cultureDNABioData));
- }
- this.mOutputItems[1] = GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L);
- this.calculateOverclockedNess(
- BW_Util.getMachineVoltageFromTier(rTier + cultureDNABioData.getTier()),
- 500);
-
- return GT_MetaTileEntity_BasicMachine.FOUND_AND_SUCCESSFULLY_USED_RECIPE;
- }
- break;
- case PCR_THERMOCYCLE_MODULE: {
- if (GT_Utility.isStackValid(this.mInventory[this.getInputSlot()])
- && this.mInventory[this.getInputSlot()].getItem() instanceof LabParts
- && this.mInventory[this.getInputSlot()].getItemDamage() == 1
- && this.mInventory[this.getInputSlot()].getTagCompound() != null
- && // checks if it is a Culture
- GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 3])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot() + 3], ItemList.Tool_DataOrb.get(1L))
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 1])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot() + 1], FluidLoader.BioLabFluidCells[0])
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 2])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot() + 2], FluidLoader.BioLabFluidCells[3])
- && this.mFluid != null
- && this.mFluid.isFluidEqual(dnaFluid)
- && this.mFluid.amount >= 1000) {
- NBTTagCompound DNABioDataTag = this.mInventory[this.getInputSlot()].getTagCompound();
- if (DNABioDataTag == null) return super.checkRecipe(skipOC);
- BioData cultureDNABioData = BioData.getBioDataFromName(DNABioDataTag.getString("Name"));
- if (cultureDNABioData == null) return super.checkRecipe(skipOC);
-
- if (this.mTier < 1 + rTier + cultureDNABioData.getTier())
- return GT_MetaTileEntity_BasicMachine.FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
-
- for (int i = 0; i < 4; i++) {
- if (this.mInventory[this.getInputSlot() + i] != null)
- this.mInventory[this.getInputSlot() + i].stackSize--;
- }
-
- this.mFluid.amount -= 1000;
-
- ItemStack Outp = ItemList.Tool_DataOrb.get(1L);
- Behaviour_DataOrb.setDataTitle(Outp, "DNA Sample");
- Behaviour_DataOrb.setDataName(Outp, cultureDNABioData.getName());
-
- if (cultureDNABioData.getChance() > new XSTR().nextInt(10000)) {
- this.mOutputItems[0] = Outp;
- } else this.mOutputItems[0] = ItemList.Tool_DataOrb.get(1L);
- this.mOutputItems[1] = ItemList.Cell_Empty.get(2L);
-
- this.calculateOverclockedNess(
- BW_Util.getMachineVoltageFromTier(1 + rTier + cultureDNABioData.getTier()),
- 500);
-
- return GT_MetaTileEntity_BasicMachine.FOUND_AND_SUCCESSFULLY_USED_RECIPE;
- }
- }
- break;
- case PLASMID_SYNTHESIS_MODULE: {
- ItemStack inp2 = ItemList.Tool_DataOrb.get(1L);
- Behaviour_DataOrb.setDataTitle(inp2, "DNA Sample");
- Behaviour_DataOrb.setDataName(inp2, BioCultureLoader.BIO_DATA_BETA_LACMATASE.getName());
- if (GT_Utility.isStackValid(this.mInventory[this.getInputSlot()])
- && GT_Utility
- .areStacksEqual(FluidLoader.BioLabFluidCells[1], this.mInventory[this.getInputSlot()])
- && // checks
- // if
- // it
- // is
- // a
- // Culture
- GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 1])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot() + 1], BioItemList.getPlasmidCell(null))
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 2])
- && GT_Utility.areStacksEqual(
- this.mInventory[this.getInputSlot() + 2],
- ItemList.Tool_DataOrb.get(1L),
- true)
- && "DNA Sample".equals(Behaviour_DataOrb.getDataTitle(this.mInventory[this.getInputSlot() + 2]))
- && !Behaviour_DataOrb.getDataName(this.mInventory[this.getInputSlot() + 2])
- .isEmpty()
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 3])
- && GT_Utility.areStacksEqual(this.mInventory[this.getInputSlot() + 3], inp2)
- && this.mFluid != null
- && this.mFluid.isFluidEqual(dnaFluid)
- && this.mFluid.amount >= 1000) {
- BioData cultureDNABioData = BioData.getBioDataFromName(
- Behaviour_DataOrb.getDataName(this.mInventory[this.getInputSlot() + 2]));
- if (cultureDNABioData == null) return super.checkRecipe(skipOC);
- if (this.mTier < 1 + rTier + cultureDNABioData.getTier())
- return GT_MetaTileEntity_BasicMachine.FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
- for (int i = 0; i < 2; i++) {
- if (this.mInventory[this.getInputSlot() + i] != null)
- this.mInventory[this.getInputSlot() + i].stackSize--;
- }
- this.mFluid.amount -= 1000;
- if (cultureDNABioData.getChance() > new XSTR().nextInt(10000)) {
- this.mOutputItems[0] = BioItemList
- .getPlasmidCell(BioPlasmid.convertDataToPlasmid(cultureDNABioData));
- }
- this.mOutputItems[1] = ItemList.Cell_Empty.get(1L);
- this.calculateOverclockedNess(
- BW_Util.getMachineVoltageFromTier(1 + rTier + cultureDNABioData.getTier()),
- 500);
- return GT_MetaTileEntity_BasicMachine.FOUND_AND_SUCCESSFULLY_USED_RECIPE;
- }
- }
- break;
- case TRANSFORMATION_MODULE: {
- if (GT_Utility.isStackValid(this.mInventory[this.getInputSlot()])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot()], BioItemList.getPetriDish(null), true)
- && this.mInventory[this.getInputSlot()].getTagCompound() != null
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 1])
- && GT_Utility.areStacksEqual(
- this.mInventory[this.getInputSlot() + 1],
- BioItemList.getPlasmidCell(null),
- true)
- && this.mInventory[this.getInputSlot() + 1].getTagCompound() != null
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 2])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot() + 2], FluidLoader.BioLabFluidCells[2])
- && this.mFluid != null
- && this.mFluid.isFluidEqual(FluidRegistry.getFluidStack("ic2distilledwater", 1000))
- && this.mFluid.amount >= 1000) {
- BioData cultureDNABioData = BioData
- .getBioDataFromNBTTag(this.mInventory[this.getInputSlot() + 1].getTagCompound());
- BioCulture bioCulture = BioCulture
- .getBioCultureFromNBTTag(this.mInventory[this.getInputSlot()].getTagCompound());
- if (cultureDNABioData == null || bioCulture == null) return super.checkRecipe(skipOC);
- if (this.mTier < 3 + rTier + cultureDNABioData.getTier())
- return GT_MetaTileEntity_BasicMachine.FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
- for (int i = 0; i < 3; i++) {
- if (this.mInventory[this.getInputSlot() + i] != null)
- this.mInventory[this.getInputSlot() + i].stackSize--;
- }
- this.mFluid.amount -= 1000;
- bioCulture = bioCulture.setPlasmid(BioPlasmid.convertDataToPlasmid(cultureDNABioData));
- if (cultureDNABioData.getChance() > new XSTR().nextInt(10000)) {
- this.mOutputItems[0] = BioItemList.getPetriDish(bioCulture);
- }
- this.mOutputItems[1] = ItemList.Cell_Empty.get(1L);
- this.calculateOverclockedNess(
- BW_Util.getMachineVoltageFromTier(3 + rTier + cultureDNABioData.getTier()),
- 500);
- return GT_MetaTileEntity_BasicMachine.FOUND_AND_SUCCESSFULLY_USED_RECIPE;
- }
- }
- break;
- case CLONAL_CELLULAR_SYNTHESIS_MODULE: {
- ItemStack Outp = ItemList.Tool_DataOrb.get(1L);
- Behaviour_DataOrb.setDataTitle(Outp, "DNA Sample");
-
- if (GT_Utility.isStackValid(this.mInventory[this.getInputSlot()])
- && GT_Utility
- .areStacksEqual(this.mInventory[this.getInputSlot()], BioItemList.getPetriDish(null))
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 1])
- && GT_Utility.areStacksEqual(this.mInventory[this.getInputSlot() + 1], BioItemList.getOther(4))
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 2])
- && GT_Utility.areStacksEqual(
- this.mInventory[this.getInputSlot() + 2],
- ItemList.Circuit_Chip_Stemcell.get(2L))
- && GT_Utility.isStackValid(this.mInventory[this.getInputSlot() + 3])
- && GT_Utility.areStacksEqual(
- this.mInventory[this.getInputSlot() + 3],
- ItemList.Tool_DataOrb.get(1L),
- true)
- && "DNA Sample".equals(Behaviour_DataOrb.getDataTitle(this.mInventory[this.getInputSlot() + 3]))
- && this.mFluid.isFluidEqual(dnaFluid)
- && this.mFluid.amount >= 8000) {
-
- BioData cultureDNABioData = BioData.getBioDataFromName(
- Behaviour_DataOrb.getDataName(this.mInventory[this.getInputSlot() + 3]));
- if (cultureDNABioData == null) return super.checkRecipe(skipOC);
- if (this.mTier < 3 + rTier + cultureDNABioData.getTier())
- return GT_MetaTileEntity_BasicMachine.FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
- for (int i = 0; i < 3; i++) {
- if (this.mInventory[this.getInputSlot() + i] != null)
- this.mInventory[this.getInputSlot() + i].stackSize--;
- }
- this.mFluid.amount -= 8000;
- if (cultureDNABioData.getChance() > new XSTR().nextInt(10000)) {
- BioCulture out = BioCulture.getBioCulture(BioDNA.convertDataToDNA(cultureDNABioData));
- if (out == null) return GT_MetaTileEntity_BasicMachine.DID_NOT_FIND_RECIPE;
- out = out.setPlasmid(BioPlasmid.convertDataToPlasmid(cultureDNABioData));
- this.mOutputItems[0] = BioItemList.getPetriDish(out);
- }
- this.calculateOverclockedNess(
- BW_Util.getMachineVoltageFromTier(3 + rTier + cultureDNABioData.getTier()),
- 500);
- return GT_MetaTileEntity_BasicMachine.FOUND_AND_SUCCESSFULLY_USED_RECIPE;
- }
- }
- break;
- case INCUBATION_MODULE:
- default:
- break;
- }
- }
- return super.checkRecipe(skipOC);
- }
-
- @Override
- public String[] getDescription() {
- return new String[] { StatCollector.translateToLocal("tooltip.tile.biolab.0.name"),
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get() };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java
deleted file mode 100644
index e0903ce93c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import net.minecraftforge.fluids.FluidStack;
-
-import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
-
-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_Hatch_Input;
-import gregtech.api.util.GT_Utility;
-
-public class GT_MetaTileEntity_CompressedFluidHatch extends GT_MetaTileEntity_Hatch_Input {
-
- public GT_MetaTileEntity_CompressedFluidHatch(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 0);
- this.mDescriptionArray[1] = "Capacity: 100,000,000L";
- }
-
- public GT_MetaTileEntity_CompressedFluidHatch(String aName, int aTier, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- @Override
- public int getCapacity() {
- return 100_000_000;
- }
-
- @Override
- public boolean isFluidInputAllowed(FluidStack aFluid) {
- return GT_Utility.areFluidsEqual(aFluid, Materials.LiquidAir.getFluid(1));
- }
-
- @Override
- public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_CompressedFluidHatch(
- this.mName,
- this.mTier,
- this.mDescriptionArray,
- this.mTextures);
- }
-
- @Override
- protected FluidSlotWidget createFluidSlot() {
- return super.createFluidSlot().setFilter(f -> f == Materials.LiquidAir.mFluid);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java
deleted file mode 100644
index 76a9c1646e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-
-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_BasicHull;
-import gregtech.api.util.GT_Utility;
-
-public class GT_MetaTileEntity_Diode extends GT_MetaTileEntity_BasicHull {
-
- private long maxAmps;
- private long aAmps;
-
- public GT_MetaTileEntity_Diode(int aID, String aName, String aNameRegional, int aTier) {
- super(aID, aName, aNameRegional, aTier, StatCollector.translateToLocal("tooltip.tile.diode.0.name"));
- this.maxAmps = this.getAmpsfromMeta(aID);
- this.aAmps = this.maxAmps;
- }
-
- public GT_MetaTileEntity_Diode(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, 0, aDescription, aTextures);
- }
-
- @Override
- public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
- super.onFirstTick(aBaseMetaTileEntity);
- if (this.maxAmps == 0 && !this.getBaseMetaTileEntity()
- .getWorld().isRemote) {
- this.maxAmps = this.getAmpsfromMeta(
- this.getBaseMetaTileEntity()
- .getMetaTileID());
- this.aAmps = this.maxAmps;
- }
- }
-
- @Override
- public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
-
- if (this.getBaseMetaTileEntity()
- .getWorld().isRemote) return;
- if (!aPlayer.isSneaking()) {
- --this.aAmps;
- if (this.aAmps < 0) this.aAmps = this.maxAmps;
- } else {
- ++this.aAmps;
- if (this.aAmps > this.maxAmps) this.aAmps = 0;
- }
- GT_Utility.sendChatToPlayer(aPlayer, "Max Amps: " + this.aAmps);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- super.saveNBTData(aNBT);
- aNBT.setLong("maxAmp", this.maxAmps);
- aNBT.setLong("Amps", this.aAmps);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- this.maxAmps = aNBT.getLong("maxAmp");
- this.aAmps = aNBT.getLong("Amps");
- super.loadNBTData(aNBT);
- }
-
- @Override
- public long maxAmperesOut() {
- return this.aAmps;
- }
-
- @Override
- public long maxAmperesIn() {
- return this.aAmps;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_Diode(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
- }
-
- private long getAmpsfromMeta(int meta) {
- if (meta > ConfigHandler.IDOffset + GT_Values.VN.length
- && meta <= ConfigHandler.IDOffset + GT_Values.VN.length * 2) return 2L;
- if (meta > ConfigHandler.IDOffset + GT_Values.VN.length * 2
- && meta <= ConfigHandler.IDOffset + GT_Values.VN.length * 3) return 4L;
- else if (meta > ConfigHandler.IDOffset + GT_Values.VN.length * 3
- && meta <= ConfigHandler.IDOffset + GT_Values.VN.length * 4) return 8L;
- else if (meta > ConfigHandler.IDOffset + GT_Values.VN.length * 4
- && meta <= ConfigHandler.IDOffset + GT_Values.VN.length * 5) return 12L;
- else if (meta > ConfigHandler.IDOffset + GT_Values.VN.length * 5
- && meta <= ConfigHandler.IDOffset + GT_Values.VN.length * 6) return 16L;
- else return 0L;
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public String[] getDescription() {
- return ArrayUtils.addAll(
- this.mDescriptionArray,
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.0.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(GT_Values.V[this.mTier]),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.1.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(this.maxAmperesIn()),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.2.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(this.maxAmperesOut()),
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get());
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java
deleted file mode 100644
index 4431015ca8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import net.minecraft.util.StatCollector;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-
-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_Transformer;
-import gregtech.api.util.GT_Utility;
-
-public class GT_MetaTileEntity_EnergyDistributor extends GT_MetaTileEntity_Transformer {
-
- public GT_MetaTileEntity_EnergyDistributor(int aID, String aName, String aNameRegional, int aTier) {
- super(aID, aName, aNameRegional, aTier, null);
- }
-
- public GT_MetaTileEntity_EnergyDistributor(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- public GT_MetaTileEntity_EnergyDistributor(String aName, int aTier, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_EnergyDistributor(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
- }
-
- @Override
- public long maxEUInput() {
- return GT_Values.V[this.mTier];
- }
-
- @Override
- public long maxEUOutput() {
- return GT_Values.V[this.mTier];
- }
-
- @Override
- public long maxAmperesOut() {
- return 320;
- }
-
- @Override
- public long maxAmperesIn() {
- return 320;
- }
-
- @Override
- public long maxEUStore() {
- return 512L + GT_Values.V[this.mTier] * 320L;
- }
-
- @Override
- public String[] getDescription() {
- return new String[] { StatCollector.translateToLocal("tooltip.tile.energydistributor.0.name"),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.0.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(GT_Values.V[this.mTier]),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.1.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(this.maxAmperesIn()),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.2.name") + " "
- + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(this.maxAmperesOut()),
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get() };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java
deleted file mode 100644
index 8d5a756cb5..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-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;
-
-public class GT_MetaTileEntity_GiantOutputHatch extends GT_MetaTileEntity_Hatch_Output {
-
- public GT_MetaTileEntity_GiantOutputHatch(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 0);
- this.mDescriptionArray[1] = "Capacity: 100000000L";
- }
-
- public GT_MetaTileEntity_GiantOutputHatch(String aName, int aTier, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- @Override
- public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_GiantOutputHatch(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
- }
-
- @Override
- public int getCapacity() {
- return 100000000;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java
deleted file mode 100644
index e9db8ac2d5..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-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;
-
-public class GT_MetaTileEntity_HumongousInputHatch extends GT_MetaTileEntity_Hatch_Input {
-
- public GT_MetaTileEntity_HumongousInputHatch(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 13);
- this.mDescriptionArray[1] = "Capacity: 2,000,000,000L";
- }
-
- public GT_MetaTileEntity_HumongousInputHatch(String aName, int aTier, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aDescription, aTextures);
- }
-
- @Override
- public int getCapacity() {
- return 2_000_000_000;
- }
-
- @Override
- public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_HumongousInputHatch(
- this.mName,
- this.mTier,
- this.mDescriptionArray,
- this.mTextures);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java
deleted file mode 100644
index 6a66b5209f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import static gregtech.api.enums.GT_Values.ticksBetweenSounds;
-
-import java.util.Collections;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.StatCollector;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.modularUI.BW_UITextures;
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-import com.gtnewhorizons.modularui.api.ModularUITextures;
-import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
-import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle;
-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.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.ProgressBar.Direction;
-import com.gtnewhorizons.modularui.common.widget.TextWidget;
-import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
-
-import gregtech.api.enums.Materials;
-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.metatileentity.IMetaTileEntity;
-import gregtech.api.interfaces.modularui.IAddGregtechLogo;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
-import gregtech.api.metatileentity.BaseMetaTileEntity;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
-import gregtech.api.objects.ItemData;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.items.GT_MetaGenerated_Tool_01;
-
-public class GT_MetaTileEntity_RadioHatch extends GT_MetaTileEntity_Hatch
- implements RecipeMapWorkable, IAddGregtechLogo {
-
- private final int cap;
- public int sievert;
- private long timer = 1;
- private long decayTime = 1;
- private short[] colorForGUI = { 0x02, 0x02, 0x02 };
- private byte mass;
- private String material;
- private byte coverage;
- private ItemStack lastUsedItem = null;
- private boolean lastFail = false;
- private GT_Recipe lastRecipe = null;
-
- public GT_MetaTileEntity_RadioHatch(int aID, String aName, String aNameRegional, int aTier) {
- super(
- aID,
- aName,
- aNameRegional,
- aTier,
- 1,
- new String[] { StatCollector.translateToLocal("tooltip.tile.radhatch.0.name"),
- StatCollector.translateToLocal("tooltip.tile.tiereddsc.3.name") + " "
- + (aTier - 2)
- + " "
- + (aTier - 2 >= 2 ? StatCollector.translateToLocal("tooltip.bw.kg.1.name")
- : StatCollector.translateToLocal("tooltip.bw.kg.0.name")),
- StatCollector.translateToLocal("tooltip.tile.radhatch.1.name"),
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get() });
- this.cap = aTier - 2;
- }
-
- public GT_MetaTileEntity_RadioHatch(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, 1, aDescription, aTextures);
- this.cap = aTier - 2;
- }
-
- public int getSievert() {
- return this.sievert - MathUtils.ceilInt(this.sievert / 100f * this.coverage);
- }
-
- public short[] getColorForGUI() {
- if (this.colorForGUI != null) return this.colorForGUI;
- return this.colorForGUI = new short[] { 0xFA, 0xFA, 0xFF };
- }
-
- public byte getMass() {
- return this.mass;
- }
-
- public byte getCoverage() {
- return this.coverage;
- }
-
- public void setCoverage(short coverage) {
- byte nu;
- if (coverage > 100) nu = 100;
- else if (coverage < 0) nu = 0;
- else nu = (byte) coverage;
- this.coverage = nu;
- }
-
- @Override
- public ITexture[] getTexturesActive(ITexture aBaseTexture) {
- return new ITexture[] { aBaseTexture, TextureFactory.of(Textures.BlockIcons.OVERLAY_PIPE_IN) };
- }
-
- @Override
- public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
- return new ITexture[] { aBaseTexture, TextureFactory.of(Textures.BlockIcons.OVERLAY_PIPE_IN) };
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_MetaTileEntity_RadioHatch(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
- }
-
- @Override
- public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
- return true;
- }
-
- public void updateSlots() {
- if (this.mInventory[0] != null && this.mInventory[0].stackSize <= 0) this.mInventory[0] = null;
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
- BaseMetaTileEntity myMetaTileEntity = (BaseMetaTileEntity) this.getBaseMetaTileEntity();
- if (myMetaTileEntity.isServerSide()) {
-
- if (this.mass > 0) {
- ++this.timer;
- }
-
- if (this.mass > 0 && (this.decayTime == 0 || this.decayTime > 0 && this.timer % this.decayTime == 0)) {
- this.mass--;
- if (this.mass == 0) {
- this.material = StatCollector.translateToLocal("tooltip.bw.empty.name");
- this.sievert = 0;
- }
- this.timer = 1;
- }
-
- if (myMetaTileEntity.mTickTimer > myMetaTileEntity.mLastSoundTick + ticksBetweenSounds
- && this.sievert > 0) {
- this.sendLoopStart((byte) 1);
- myMetaTileEntity.mLastSoundTick = myMetaTileEntity.mTickTimer;
- }
-
- if (this.mass == 0) {
- ItemStack lStack = this.mInventory[0];
-
- if (lStack == null) {
- this.colorForGUI = new short[] { 0x37, 0x37, 0x37 };
- return;
- }
- ItemData itemData = GT_OreDictUnificator.getAssociation(lStack);
- if (itemData != null) {
- Materials mat = itemData.mMaterial.mMaterial;
- this.colorForGUI = new short[] { mat.getRGBA()[0], mat.getRGBA()[1], mat.getRGBA()[2] };
- } else {
- this.colorForGUI = new short[] { 0x37, 0x37, 0x37 };
- }
-
- if (this.lastFail && GT_Utility.areStacksEqual(this.lastUsedItem, lStack, true)) {
- return;
- }
-
- if (!this.lastFail && this.lastUsedItem != null && this.lastRecipe != null) {
- if (GT_Utility.areStacksEqual(this.lastUsedItem, lStack, true)) {
- this.mass = (byte) this.lastRecipe.mDuration;
- this.decayTime = this.lastRecipe.mSpecialValue;
- this.sievert = this.lastRecipe.mEUt;
- this.material = this.lastUsedItem.getDisplayName();
- lStack.stackSize--;
- this.updateSlots();
- } else {
- this.lastRecipe = null;
- }
- }
-
- if (this.lastRecipe == null || this.lastFail) {
- this.lastRecipe = BartWorksRecipeMaps.radioHatchRecipes.findRecipe(
- this.getBaseMetaTileEntity(),
- false,
- Integer.MAX_VALUE - 7,
- null,
- this.mInventory[0]);
- if (this.lastRecipe == null) {
- this.lastFail = true;
- this.lastUsedItem = this.mInventory[0] == null ? null : this.mInventory[0].copy();
- } else {
- if (this.lastRecipe.mDuration > this.cap) {
- this.lastFail = true;
- this.lastUsedItem = this.mInventory[0].copy();
- return;
- }
- this.lastFail = false;
- this.lastUsedItem = this.mInventory[0].copy();
- this.mass = (byte) this.lastRecipe.mDuration;
- this.decayTime = this.lastRecipe.mSpecialValue;
- this.sievert = this.lastRecipe.mEUt;
- this.material = lStack.getDisplayName();
- lStack.stackSize--;
- this.updateSlots();
- }
- }
- }
- }
- }
-
- @Override
- public boolean isGivingInformation() {
- return true;
- }
-
- @Override
- public String[] getInfoData() {
- if (this.sievert != 0) return new String[] {
- StatCollector.translateToLocal("tooltip.tile.radhatch.2.name") + " "
- + StatCollector.translateToLocal(this.material),
- StatCollector.translateToLocal("tooltip.tile.radhatch.3.name") + " " + this.sievert,
- StatCollector.translateToLocal("tooltip.tile.radhatch.4.name") + " " + this.mass,
- StatCollector.translateToLocal("tooltip.tile.radhatch.5.name") + " "
- + (this.decayTime - this.timer % (this.decayTime * 60))
- + StatCollector.translateToLocal("tooltip.tile.radhatch.6.name")
- + "/"
- + (this.decayTime - this.timer % this.decayTime) / 20
- + StatCollector.translateToLocal("tooltip.tile.radhatch.7.name")
- + "/"
- + (this.decayTime - this.timer % this.decayTime) / 20 / 60
- + StatCollector.translateToLocal("tooltip.tile.radhatch.8.name")
- + "/"
- + (this.decayTime - this.timer % this.decayTime) / 20 / 60 / 60
- + StatCollector.translateToLocal("tooltip.tile.radhatch.9.name") };
- return new String[] {
- StatCollector.translateToLocal("tooltip.tile.radhatch.2.name") + " "
- + StatCollector.translateToLocal("tooltip.bw.empty.name"),
- StatCollector.translateToLocal("tooltip.tile.radhatch.3.name") + " " + "0",
- StatCollector.translateToLocal("tooltip.tile.radhatch.4.name") + " " + "0" };
- }
-
- @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 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 == this.getBaseMetaTileEntity()
- .getFrontFacing() && BartWorksRecipeMaps.radioHatchRecipes.containsInput(aStack);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- aNBT.setByte("mMass", this.mass);
- aNBT.setByte("mSv", (byte) (this.sievert - 100));
- aNBT.setByte("mCoverage", this.coverage);
- aNBT.setInteger("mTextColor", BW_ColorUtil.getColorFromRGBArray(this.getColorForGUI()));
- if (this.material != null && !this.material.isEmpty()) aNBT.setString("mMaterial", this.material);
- aNBT.setLong("timer", this.timer);
- aNBT.setLong("decay", this.decayTime);
- super.saveNBTData(aNBT);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- this.timer = aNBT.getLong("timer");
- this.mass = aNBT.getByte("mMass");
- this.sievert = aNBT.getByte("mSv") + 100;
- this.coverage = aNBT.getByte("mCoverage");
- this.colorForGUI = BW_ColorUtil.splitColorToRBGArray(aNBT.getInteger("mTextColor"));
- this.material = aNBT.getString("mMaterial");
- this.decayTime = aNBT.getLong("decay");
- super.loadNBTData(aNBT);
- }
-
- @Override
- public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
- super.startSoundLoop(aIndex, aX, aY, aZ);
- ResourceLocation rl = new ResourceLocation(MainMod.MOD_ID, "hatch.RadOn");
- if (aIndex == 1) {
- GT_Utility.doSoundAtClient(rl, 10, 1.0F, aX, aY, aZ);
- }
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- // Only for visual
- return BartWorksRecipeMaps.radioHatchRecipes;
- }
-
- private static final int RADIATION_SHUTTER_WINDOW_ID = 999;
-
- @Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- buildContext.addSyncedWindow(RADIATION_SHUTTER_WINDOW_ID, this::createShutterWindow);
-
- this.getBaseMetaTileEntity()
- .add1by1Slot(builder);
- builder.widget(
- new DrawableWidget().setBackground(BW_UITextures.PICTURE_SIEVERT_CONTAINER)
- .setPos(61, 9)
- .setSize(56, 24))
- .widget(
- new ProgressBar().setProgress(() -> this.getSievert() / 148f)
- .setDirection(Direction.RIGHT)
- .setTexture(BW_UITextures.PROGRESSBAR_SIEVERT, 24)
- .setPos(65, 13)
- .setSize(48, 16))
- .widget(
- new DrawableWidget().setBackground(BW_UITextures.PICTURE_DECAY_TIME_INSIDE)
- .setPos(124, 18)
- .setSize(16, 48))
- .widget(new DrawableWidget() {
-
- @Override
- public void draw(float partialTicks) {
- if (GT_MetaTileEntity_RadioHatch.this.decayTime > 0) {
- int height = MathUtils.ceilInt(
- 48 * ((GT_MetaTileEntity_RadioHatch.this.decayTime
- - GT_MetaTileEntity_RadioHatch.this.timer % GT_MetaTileEntity_RadioHatch.this.decayTime)
- / (float) GT_MetaTileEntity_RadioHatch.this.decayTime));
- new Rectangle()
- .setColor(
- Color.argb(
- GT_MetaTileEntity_RadioHatch.this.colorForGUI[0],
- GT_MetaTileEntity_RadioHatch.this.colorForGUI[1],
- GT_MetaTileEntity_RadioHatch.this.colorForGUI[2],
- 255))
- .draw(new Pos2d(0, 48 - height), new Size(16, height), partialTicks);
- }
- }
- }.dynamicTooltip(
- () -> Collections.singletonList(
- StatCollector.translateToLocalFormatted(
- "tooltip.tile.radhatch.10.name",
- this.timer <= 1 ? 0 : (this.decayTime - this.timer) / 20,
- this.timer <= 1 ? 0 : this.decayTime / 20)))
- .setPos(124, 18)
- .setSize(16, 48)
- .attachSyncer(
- new FakeSyncWidget.LongSyncer(() -> this.decayTime, val -> this.decayTime = val),
- builder,
- (widget, val) -> widget.notifyTooltipChange())
- .attachSyncer(
- new FakeSyncWidget.LongSyncer(() -> this.timer, val -> this.timer = val),
- builder,
- (widget, val) -> widget.notifyTooltipChange()))
- .widget(new FakeSyncWidget.ShortSyncer(() -> this.colorForGUI[0], val -> this.colorForGUI[0] = val))
- .widget(new FakeSyncWidget.ShortSyncer(() -> this.colorForGUI[1], val -> this.colorForGUI[1] = val))
- .widget(new FakeSyncWidget.ShortSyncer(() -> this.colorForGUI[2], val -> this.colorForGUI[2] = val))
- .widget(
- new DrawableWidget().setBackground(BW_UITextures.PICTURE_DECAY_TIME_CONTAINER)
- .setPos(120, 14)
- .setSize(24, 56))
- .widget(
- new TextWidget()
- .setStringSupplier(
- () -> StatCollector.translateToLocalFormatted("BW.NEI.display.radhatch.1", this.mass))
- .setTextAlignment(Alignment.Center)
- .setPos(65, 62))
- .widget(new FakeSyncWidget.ByteSyncer(() -> this.mass, val -> this.mass = val))
- .widget(
- new TextWidget()
- .setStringSupplier(
- () -> StatCollector.translateToLocalFormatted("BW.NEI.display.radhatch.0", this.getSievert()))
- .setTextAlignment(Alignment.Center)
- .setPos(60, 72))
- .widget(new FakeSyncWidget.IntegerSyncer(() -> this.sievert, val -> this.sievert = val))
- .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
- if (!widget.isClient()) {
- widget.getContext()
- .openSyncedWindow(RADIATION_SHUTTER_WINDOW_ID);
- }
- })
- .addTooltip("Radiation Shutter")
- .setBackground(GT_UITextures.BUTTON_STANDARD)
- .setPos(153, 5)
- .setSize(18, 18))
- .widget(
- new ItemDrawable(
- GT_MetaGenerated_Tool_01.INSTANCE
- .getToolWithStats(GT_MetaGenerated_Tool_01.SCREWDRIVER, 1, null, null, null)).asWidget()
- .setPos(154, 6));
- }
-
- private ModularWindow createShutterWindow(EntityPlayer player) {
- ModularWindow.Builder builder = ModularWindow.builder(176, 107);
- builder.setBackground(ModularUITextures.VANILLA_BACKGROUND);
- builder.setGuiTint(this.getGUIColorization());
-
- builder.widget(
- new TextWidget("Radiation Shutter Control").setDefaultColor(this.COLOR_TITLE.get())
- .setPos(10, 9))
- .widget(
- new DrawableWidget().setDrawable(BW_UITextures.PICTURE_RADIATION_SHUTTER_FRAME)
- .setPos(14, 27)
- .setSize(55, 54))
- .widget(
- new DrawableWidget()
- .setDrawable(() -> this.coverage < 100 ? BW_UITextures.PICTURE_RADIATION_SHUTTER_INSIDE : null)
- .setPos(16, 29)
- .setSize(51, 50)
- .attachSyncer(
- new FakeSyncWidget.ByteSyncer(this::getCoverage, this::setCoverage),
- builder,
- (widget, val) -> widget.setPos(16, 29 + this.coverage / 2)
- .setSize(51, 50 - this.coverage / 2)))
- .widget(
- new NumericWidget().setSetter(val -> this.coverage = (byte) val)
- .setGetter(() -> this.coverage)
- .setBounds(0, 100)
- .setScrollValues(1, 5, 50)
- .setTextColor(Color.WHITE.dark(1))
- .setTextAlignment(Alignment.CenterLeft)
- .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2))
- .setPos(86, 27)
- .setSize(30, 12))
- .widget(
- ButtonWidget.closeWindowButton(true)
- .setPos(176 - 15, 3));
-
- return builder.build();
- }
-
- @Override
- public void addGregTechLogo(ModularWindow.Builder builder) {
- builder.widget(
- new DrawableWidget().setDrawable(BW_UITextures.PICTURE_BW_LOGO_47X21)
- .setSize(47, 21)
- .setPos(10, 53));
- }
-
- @Override
- public GUITextureSet getGUITextureSet() {
- return new GUITextureSet().setMainBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT)
- .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT);
- }
-
- @Override
- public boolean useModularUI() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java
deleted file mode 100644
index 46f20e441d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.common.tileentities.tiered;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.tileentity.TileEntity;
-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.IBasicEnergyContainer;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
-
-public class GT_MetaTileEntity_Transistor extends GT_MetaTileEntity_TieredMachineBlock {
-
- boolean powered;
-
- public GT_MetaTileEntity_Transistor(int aID, String aName, String aNameRegional, int aTier, String aDescription,
- ITexture... aTextures) {
- super(aID, aName, aNameRegional, aTier, 0, aDescription, aTextures);
- }
-
- public GT_MetaTileEntity_Transistor(int aID, String aName, String aNameRegional, int aTier, String[] aDescription,
- ITexture... aTextures) {
- super(aID, aName, aNameRegional, aTier, 0, aDescription, aTextures);
- }
-
- public GT_MetaTileEntity_Transistor(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, 0, aDescription, aTextures);
- }
-
- public GT_MetaTileEntity_Transistor(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[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
- rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
- rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
- rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[this.mTier] };
- rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[this.mTier] };
- rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[this.mTier] };
- rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN[this.mTier] };
- rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN[this.mTier] };
- rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN[this.mTier] };
- rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
- rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
- rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
- }
-
- return rTextures;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new GT_MetaTileEntity_Transistor(this.mName, this.mTier, this.getDescription(), null);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound nbtTagCompound) {}
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (aBaseMetaTileEntity.isServerSide()) {
- final ForgeDirection side = ForgeDirection.EAST;
- if (aBaseMetaTileEntity.inputEnergyFrom(side)) {
- TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side);
- if (!(tTileEntity instanceof IBasicEnergyContainer tileAtSide)) {
- this.powered = false;
- return;
- }
- if (!tileAtSide.outputsEnergyTo(ForgeDirection.WEST) || !tileAtSide.isUniversalEnergyStored(4L)
- || !tileAtSide.decreaseStoredEnergyUnits(4, false)) {
- this.powered = false;
- return;
- }
- if (aBaseMetaTileEntity.injectEnergyUnits(side, 4L, 1L) == 4L) {
- this.powered = true;
- }
- }
-
- if (aBaseMetaTileEntity.isAllowedToWork()) this.powered = !this.powered;
- }
- }
-
- @Override
- public long maxEUInput() {
- return GT_Values.V[this.mTier];
- }
-
- @Override
- public long maxAmperesIn() {
- return 1L;
- }
-
- @Override
- public long maxAmperesOut() {
- return this.powered ? 1L : 0;
- }
-
- @Override
- public long maxEUOutput() {
- return this.powered ? GT_Values.V[this.mTier] : 0;
- }
-
- @Override
- public void loadNBTData(NBTTagCompound nbtTagCompound) {}
-
- @Override
- public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
- ItemStack itemStack) {
- return false;
- }
-
- @Override
- public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
- ItemStack itemStack) {
- return false;
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity iGregTechTileEntity, ForgeDirection side, ForgeDirection facing,
- int colorIndex, boolean b3, boolean b4) {
- return new ITexture[0];
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java
deleted file mode 100644
index 40233912e6..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.neiHandler;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.items.LabParts;
-
-import codechicken.nei.recipe.GuiCraftingRecipe;
-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.recipe.RecipeCategory;
-import gregtech.nei.GT_NEI_DefaultHandler;
-
-public class BW_NEI_BioLabHandler extends GT_NEI_DefaultHandler {
-
- public BW_NEI_BioLabHandler(RecipeCategory recipeCategory) {
- super(recipeCategory);
- if (!NEI_BW_Config.sIsAdded) {
- FMLInterModComms.sendRuntimeMessage(
- GT_Values.GT,
- "NEIPlugins",
- "register-crafting-handler",
- "gregtech@" + this.getRecipeName() + "@" + this.getOverlayIdentifier());
- GuiCraftingRecipe.craftinghandlers.add(this);
- GuiUsageRecipe.usagehandlers.add(this);
- }
- }
-
- @Override
- public TemplateRecipeHandler newInstance() {
- return new BW_NEI_BioLabHandler(this.recipeCategory);
- }
-
- @Override
- public void loadCraftingRecipes(ItemStack aResult) {
- if (aResult != null && aResult.getItem() instanceof LabParts
- && aResult.getItemDamage() < 3
- && aResult.getTagCompound() != null) {
- for (CachedDefaultRecipe recipe : this.getCache())
- if (NEI_BW_Config.checkRecipe(aResult, recipe.mOutputs)) this.arecipes.add(recipe);
- } else {
- super.loadCraftingRecipes(aResult);
- }
- }
-
- @Override
- public void loadUsageRecipes(ItemStack aResult) {
- if (aResult != null && aResult.getItem() instanceof LabParts
- && aResult.getItemDamage() < 3
- && aResult.getTagCompound() != null) {
- for (CachedDefaultRecipe recipe : this.getCache())
- if (NEI_BW_Config.checkRecipe(aResult, recipe.mInputs)) this.arecipes.add(recipe);
- } else {
- super.loadUsageRecipes(aResult);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java
deleted file mode 100644
index cddb16c6c8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.neiHandler;
-
-import java.util.Collections;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.common.items.LabParts;
-
-import codechicken.nei.PositionedStack;
-import codechicken.nei.recipe.GuiCraftingRecipe;
-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.recipe.RecipeCategory;
-import gregtech.nei.GT_NEI_DefaultHandler;
-
-public class BW_NEI_BioVatHandler extends GT_NEI_DefaultHandler {
-
- public BW_NEI_BioVatHandler(RecipeCategory recipeCategory) {
- super(recipeCategory);
- if (!NEI_BW_Config.sIsAdded) {
- FMLInterModComms.sendRuntimeMessage(
- GT_Values.GT,
- "NEIPlugins",
- "register-crafting-handler",
- "gregtech@" + this.getRecipeName() + "@" + this.getOverlayIdentifier());
- GuiCraftingRecipe.craftinghandlers.add(this);
- GuiUsageRecipe.usagehandlers.add(this);
- }
- }
-
- @Override
- public TemplateRecipeHandler newInstance() {
- return new BW_NEI_BioVatHandler(this.recipeCategory);
- }
-
- private void loadLabPartRecipes(ItemStack aResult) {
- for (CachedDefaultRecipe recipe : this.getCache()) {
- // dirty way of finding the special slot item
- // see constructor of CachedDefaultRecipe on why relx==120 and rely==52 means special slot
- for (PositionedStack stack : recipe.mInputs) {
- if (stack.relx == 120 && stack.rely == 52
- && NEI_BW_Config.checkRecipe(aResult, Collections.singletonList(stack))) this.arecipes.add(recipe);
- }
- }
- }
-
- @Override
- public void loadUsageRecipes(ItemStack aResult) {
- if (aResult != null && aResult.getItem() instanceof LabParts
- && aResult.getItemDamage() < 3
- && aResult.getTagCompound() != null) {
- this.loadLabPartRecipes(aResult);
- } else {
- super.loadUsageRecipes(aResult);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java
deleted file mode 100644
index 2b34250512..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.neiHandler;
-
-import java.awt.Rectangle;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-
-import net.minecraft.block.Block;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Ores;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_SmallOres;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_OreLayer;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_WorldGenRoss128b;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_WorldGenRoss128ba;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-
-import codechicken.lib.gui.GuiDraw;
-import codechicken.nei.PositionedStack;
-import codechicken.nei.recipe.GuiCraftingRecipe;
-import codechicken.nei.recipe.TemplateRecipeHandler;
-import cpw.mods.fml.common.event.FMLInterModComms;
-import gregtech.api.enums.OrePrefixes;
-
-public class BW_NEI_OreHandler extends TemplateRecipeHandler {
-
- public BW_NEI_OreHandler() {
- if (!NEI_BW_Config.sIsAdded) {
- FMLInterModComms.sendRuntimeMessage(
- MainMod.MOD_ID,
- "NEIPlugins",
- "register-crafting-handler",
- MainMod.MOD_ID + "@" + this.getRecipeName() + "@" + this.getOverlayIdentifier());
- GuiCraftingRecipe.craftinghandlers.add(this);
- }
- }
-
- @Override
- public void drawBackground(int recipe) {
- GuiDraw.drawRect(0, 0, 166, 65, 0x888888);
- }
-
- @Override
- public void loadTransferRects() {
- this.transferRects.add(
- new TemplateRecipeHandler.RecipeTransferRect(new Rectangle(0, 40, 40, 120), "quickanddirtyneihandler"));
- }
-
- @Override
- public int recipiesPerPage() {
- return 1;
- }
-
- @Override
- public void loadCraftingRecipes(String outputId, Object... results) {
- if ("quickanddirtyneihandler".equalsIgnoreCase(outputId)) {
- HashSet<ItemStack> result = new HashSet<>();
- Werkstoff.werkstoffHashSet.stream()
- .filter(w -> w.hasGenerationFeature(OrePrefixes.ore))
- .forEach(w -> result.add(w.get(OrePrefixes.ore)));
- result.forEach(this::loadCraftingRecipes);
- result.clear();
- Werkstoff.werkstoffHashSet.stream()
- .filter(w -> w.hasGenerationFeature(OrePrefixes.ore))
- .forEach(w -> result.add(w.get(OrePrefixes.oreSmall)));
- result.forEach(this::loadCraftingRecipes);
- result.clear();
- HashSet<TemplateRecipeHandler.CachedRecipe> hashSet = new HashSet<>(this.arecipes);
- this.arecipes.clear();
- this.arecipes.addAll(hashSet);
- }
- if ("item".equals(outputId)) {
- this.loadCraftingRecipes((ItemStack) results[0]);
- HashSet<TemplateRecipeHandler.CachedRecipe> hashSet = new HashSet<>(this.arecipes);
- this.arecipes.clear();
- this.arecipes.addAll(hashSet);
- }
- }
-
- @Override
- public void drawExtras(int recipe) {
- if (recipe < this.arecipes.size() && this.arecipes.get(recipe) instanceof CachedOreRecipe) {
- CachedOreRecipe cachedOreRecipe = (CachedOreRecipe) this.arecipes.get(recipe);
-
- if (cachedOreRecipe == null || cachedOreRecipe.getOtherStacks() == null
- || cachedOreRecipe.getOtherStacks()
- .size() == 0)
- return;
-
- if (!cachedOreRecipe.small) {
- if (cachedOreRecipe.getOtherStacks()
- .get(0) == null
- || cachedOreRecipe.getOtherStacks()
- .get(0).item == null
- || cachedOreRecipe.getOtherStacks()
- .get(1) == null
- || cachedOreRecipe.getOtherStacks()
- .get(2) == null
- || cachedOreRecipe.getOtherStacks()
- .get(3) == null
- || cachedOreRecipe.getOtherStacks()
- .get(1).item == null
- || cachedOreRecipe.getOtherStacks()
- .get(2).item == null
- || cachedOreRecipe.getOtherStacks()
- .get(3).item == null)
- return;
- } else if (cachedOreRecipe.getOtherStacks()
- .get(0) == null
- || cachedOreRecipe.getOtherStacks()
- .get(0).item == null)
- return;
-
- if (cachedOreRecipe.worldGen != null) GuiDraw.drawString(
- ChatColorHelper.BOLD + "DIM: " + ChatColorHelper.RESET + cachedOreRecipe.worldGen.getDimName(),
- 0,
- 40,
- 0,
- false);
-
- GuiDraw.drawString(ChatColorHelper.BOLD + "Primary:", 0, 50, 0, false);
- GuiDraw.drawString(
- cachedOreRecipe.getOtherStacks()
- .get(0).item.getDisplayName(),
- 0,
- 60,
- 0,
- false);
-
- if (!cachedOreRecipe.small) {
- GuiDraw.drawString(ChatColorHelper.BOLD + "Secondary:", 0, 70, 0, false);
- GuiDraw.drawString(
- cachedOreRecipe.getOtherStacks()
- .get(1).item.getDisplayName(),
- 0,
- 80,
- 0,
- false);
- GuiDraw.drawString(ChatColorHelper.BOLD + "InBetween:", 0, 90, 0, false);
- GuiDraw.drawString(
- cachedOreRecipe.getOtherStacks()
- .get(2).item.getDisplayName(),
- 0,
- 100,
- 0,
- false);
- GuiDraw.drawString(ChatColorHelper.BOLD + "Sporadic:", 0, 110, 0, false);
- GuiDraw.drawString(
- cachedOreRecipe.getOtherStacks()
- .get(3).item.getDisplayName(),
- 0,
- 120,
- 0,
- false);
- } else if (cachedOreRecipe.worldGen != null) {
- GuiDraw.drawString(ChatColorHelper.BOLD + "Amount per Chunk:", 0, 70, 0, false);
- GuiDraw.drawString(cachedOreRecipe.worldGen.mDensity + "", 0, 80, 0, false);
- }
- }
- super.drawExtras(recipe);
- }
-
- @Override
- public void loadCraftingRecipes(ItemStack result) {
- Block ore = Block.getBlockFromItem(result.getItem());
- if (ore instanceof BW_MetaGenerated_Ores) {
- BW_OreLayer.NEIMAP.get((short) result.getItemDamage())
- .stream()
- .filter(
- l -> !(ore instanceof BW_MetaGenerated_SmallOres) || !l.getClass()
- .equals(BW_WorldGenRoss128b.class)
- && !l.getClass()
- .equals(BW_WorldGenRoss128ba.class))
- .forEach(
- l -> this.arecipes.add(new CachedOreRecipe(l, result, ore instanceof BW_MetaGenerated_SmallOres)));
- }
- }
-
- @Override
- public String getGuiTexture() {
- return "textures/gui/container/brewing_stand.png";
- }
-
- @Override
- public String getRecipeName() {
- return "BartWorks Ores";
- }
-
- class CachedOreRecipe extends TemplateRecipeHandler.CachedRecipe {
-
- public CachedOreRecipe(BW_OreLayer worldGen, ItemStack result, boolean smallOres) {
- this.worldGen = worldGen;
- this.stack = new PositionedStack(result, 0, 0);
- this.small = smallOres;
- }
-
- boolean small;
- BW_OreLayer worldGen;
- PositionedStack stack;
-
- @Override
- public PositionedStack getResult() {
- return this.stack;
- }
-
- @Override
- public List<PositionedStack> getOtherStacks() {
- List<PositionedStack> ret = new ArrayList<>();
- int x = 0;
- for (int i = 0; i < (this.small ? 1 : 4); i++) {
- x += 20;
- ret.add(
- new PositionedStack(
- this.worldGen.getStacks()
- .get(i),
- x,
- 12));
- }
- return ret;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof CachedOreRecipe that)) return false;
- return Objects.equals(this.worldGen, that.worldGen);
- }
-
- @Override
- public int hashCode() {
- return this.worldGen.hashCode();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java
deleted file mode 100644
index a6efebeb83..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.neiHandler;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-import codechicken.nei.PositionedStack;
-import codechicken.nei.api.API;
-import codechicken.nei.api.IConfigureNEI;
-import gregtech.api.enums.OrePrefixes;
-
-public class NEI_BW_Config implements IConfigureNEI {
-
- static boolean sIsAdded = true;
-
- static boolean checkRecipe(ItemStack labPart, Iterable<? extends PositionedStack> stacks) {
- for (PositionedStack stack : stacks) {
- for (ItemStack item : stack.items) {
- if (labPart.getTagCompound()
- .equals(item.getTagCompound())) {
- return true;
- }
- }
- }
- return false;
- }
-
- @Override
- public void loadConfig() {
- API.hideItem(new ItemStack(ItemRegistry.TAB));
- API.hideItem(new ItemStack(FluidLoader.bioFluidBlock));
- API.hideItem(new ItemStack(ItemRegistry.bw_fake_glasses));
- API.hideItem(new ItemStack(ItemRegistry.bw_fake_glasses2));
- ItemStack[] prefixesToHide = {
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.dustTiny, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.dustSmall, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.crushed, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.crushedPurified, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.crushedCentrifuged, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.nugget, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.gemChipped, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.gemFlawed, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.gemFlawless, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.gemExquisite, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.dustImpure, WerkstoffLoader.Bismutite)
- .copy(),
- WerkstoffLoader.getCorrespondingItemStack(OrePrefixes.dustPure, WerkstoffLoader.Bismutite)
- .copy(), };
- for (ItemStack stack : prefixesToHide) {
- stack.setItemDamage(Short.MAX_VALUE);
- API.hideItem(stack);
- }
-
- NEI_BW_Config.sIsAdded = false;
- new BW_NEI_OreHandler();
- new BW_NEI_BioVatHandler(BartWorksRecipeMaps.bacterialVatRecipes.getDefaultRecipeCategory());
- new BW_NEI_BioLabHandler(BartWorksRecipeMaps.bioLabRecipes.getDefaultRecipeCategory());
- NEI_BW_Config.sIsAdded = true;
- }
-
- @Override
- public String getName() {
- return "BartWorks NEI Plugin";
- }
-
- @Override
- public String getVersion() {
- return MainMod.APIVERSION;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java
deleted file mode 100644
index 3ea2f28cb9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.server.EventHandler;
-
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.event.entity.EntityJoinWorldEvent;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.net.OreDictCachePacket;
-import com.github.bartimaeusnek.bartworks.common.net.ServerJoinedPackage;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.oredict.OreDictHandler;
-
-import cpw.mods.fml.common.eventhandler.EventPriority;
-import cpw.mods.fml.common.eventhandler.SubscribeEvent;
-import cpw.mods.fml.common.gameevent.TickEvent;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class ServerEventHandler {
-
- // MinecraftForge.EVENT_BUS
- @SubscribeEvent(priority = EventPriority.LOWEST)
- public void EntityJoinWorldEvent(EntityJoinWorldEvent event) {
- if (event == null || !(event.entity instanceof EntityPlayerMP) || !SideReference.Side.Server) return;
- MainMod.BW_Network_instance
- .sendToPlayer(new OreDictCachePacket(OreDictHandler.getNonBWCache()), (EntityPlayerMP) event.entity);
- MainMod.BW_Network_instance.sendToPlayer(new ServerJoinedPackage(null), (EntityPlayerMP) event.entity);
- }
-
- // FMLCommonHandler.instance().bus()
- @SubscribeEvent(priority = EventPriority.HIGHEST)
- public void onPlayerTickEventServer(TickEvent.PlayerTickEvent event) {
- if (event == null || !(event.player instanceof EntityPlayerMP)
- || event.player.worldObj.getTotalWorldTime() % 20 != 0) return;
-
- boolean replace = false;
- ItemStack toReplace = null;
- for (int i = 0; i < event.player.inventory.mainInventory.length; i++) {
- ItemStack stack = event.player.inventory.mainInventory[i];
- if (stack == null) continue;
- int[] oreIDs = OreDictionary.getOreIDs(stack);
-
- if (oreIDs.length > 0) {
- loop: for (int oreID : oreIDs) {
- String oreDictName = OreDictionary.getOreName(oreID);
- for (Werkstoff e : Werkstoff.werkstoffHashSet) {
- replace = e.getGenerationFeatures().enforceUnification;
- if (replace) {
- if (oreDictName.contains(e.getVarName())) {
- String prefix = oreDictName.replace(e.getVarName(), "");
- OrePrefixes prefixes = OrePrefixes.getPrefix(prefix);
- if (prefixes == null) {
- continue;
- }
- toReplace = GT_OreDictUnificator.get(prefixes, e.getVarName(), stack.stackSize);
- break loop;
- }
- for (String s : e.getADDITIONAL_OREDICT()) {
- if (oreDictName.contains(s)) {
- String prefix = oreDictName.replace(s, "");
- OrePrefixes prefixes = OrePrefixes.getPrefix(prefix);
- if (prefixes == null) {
- continue;
- }
- toReplace = GT_OreDictUnificator.get(prefixes, e.getVarName(), stack.stackSize);
- break loop;
- }
- }
- }
- replace = false;
- }
- }
- }
- if (replace && toReplace != null) {
- event.player.inventory.setInventorySlotContents(i, toReplace);
- replace = false;
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java
deleted file mode 100644
index 87ee19833d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.Types.BIOLOGICAL;
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.Types.COMPOUND;
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.Types.ELEMENT;
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.Types.ISOTOPE;
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.Types.MIXTURE;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-
-import gregtech.api.enums.Materials;
-
-public class BW_GT_MaterialReference {
-
- private static final Werkstoff.GenerationFeatures ADD_CASINGS_ONLY = new Werkstoff.GenerationFeatures().disable()
- .addCasings();
-
- public static Werkstoff Aluminium = new Werkstoff(Materials.Aluminium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 19);
- public static Werkstoff Americium = new Werkstoff(Materials.Americium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 103);
- public static Werkstoff Antimony = new Werkstoff(Materials.Antimony, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 58);
- public static Werkstoff Arsenic = new Werkstoff(Materials.Arsenic, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 39);
- public static Werkstoff Barium = new Werkstoff(Materials.Barium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 63);
- public static Werkstoff Beryllium = new Werkstoff(Materials.Beryllium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 8);
- public static Werkstoff Bismuth = new Werkstoff(Materials.Bismuth, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 90);
- public static Werkstoff Boron = new Werkstoff(Materials.Boron, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 9);
- public static Werkstoff Caesium = new Werkstoff(Materials.Caesium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 62);
- public static Werkstoff Carbon = new Werkstoff(Materials.Carbon, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 10);
- public static Werkstoff Cadmium = new Werkstoff(Materials.Cadmium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 55);
- public static Werkstoff Cerium = new Werkstoff(Materials.Cerium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 65);
- public static Werkstoff Chrome = new Werkstoff(Materials.Chrome, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 30);
- public static Werkstoff Cobalt = new Werkstoff(Materials.Cobalt, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 33);
- public static Werkstoff Copper = new Werkstoff(Materials.Copper, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 35);
- public static Werkstoff Dysprosium = new Werkstoff(Materials.Dysprosium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 73);
- public static Werkstoff Erbium = new Werkstoff(Materials.Erbium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 75);
- public static Werkstoff Europium = new Werkstoff(Materials.Europium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 70);
- public static Werkstoff Gadolinium = new Werkstoff(Materials.Gadolinium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 71);
- public static Werkstoff Gallium = new Werkstoff(Materials.Gallium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 37);
- public static Werkstoff Gold = new Werkstoff(Materials.Gold, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 86);
- public static Werkstoff Holmium = new Werkstoff(Materials.Holmium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 74);
- public static Werkstoff Indium = new Werkstoff(Materials.Indium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 56);
- public static Werkstoff Iridium = new Werkstoff(Materials.Iridium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 84);
- public static Werkstoff Iron = new Werkstoff(Materials.Iron, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 32);
- public static Werkstoff Lanthanum = new Werkstoff(Materials.Lanthanum, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 64);
- public static Werkstoff Lead = new Werkstoff(Materials.Lead, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 89);
- public static Werkstoff Lithium = new Werkstoff(Materials.Lithium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 6);
- public static Werkstoff Lutetium = new Werkstoff(Materials.Lutetium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 78);
- public static Werkstoff Magnesium = new Werkstoff(Materials.Magnesium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 18);
- public static Werkstoff Manganese = new Werkstoff(Materials.Manganese, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 31);
- public static Werkstoff Molybdenum = new Werkstoff(Materials.Molybdenum, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 48);
- public static Werkstoff Neodymium = new Werkstoff(Materials.Neodymium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 67);
- public static Werkstoff Neutronium = new Werkstoff(Materials.Neutronium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 129);
- public static Werkstoff Nickel = new Werkstoff(Materials.Nickel, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 34);
- public static Werkstoff Niobium = new Werkstoff(Materials.Niobium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 47);
- public static Werkstoff Osmium = new Werkstoff(Materials.Osmium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 83);
- public static Werkstoff Palladium = new Werkstoff(Materials.Palladium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 52);
- public static Werkstoff Phosphorus = new Werkstoff(Materials.Phosphorus, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 21);
- public static Werkstoff Platinum = new Werkstoff(Materials.Platinum, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 85);
- public static Werkstoff Plutonium241 = new Werkstoff(
- Materials.Plutonium241,
- ADD_CASINGS_ONLY,
- ISOTOPE,
- 31_766 + 101);
- public static Werkstoff Potassium = new Werkstoff(Materials.Potassium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 25);
- public static Werkstoff Praseodymium = new Werkstoff(
- Materials.Praseodymium,
- ADD_CASINGS_ONLY,
- ELEMENT,
- 31_766 + 66);
- public static Werkstoff Promethium = new Werkstoff(Materials.Promethium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 68);
- public static Werkstoff Rubidium = new Werkstoff(Materials.Rubidium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 43);
- public static Werkstoff Samarium = new Werkstoff(Materials.Samarium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 69);
- public static Werkstoff Scandium = new Werkstoff(Materials.Scandium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 27);
- public static Werkstoff Silicon = new Werkstoff(Materials.Silicon, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 20);
- public static Werkstoff Silver = new Werkstoff(Materials.Silver, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 54);
- public static Werkstoff Sodium = new Werkstoff(Materials.Sodium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 17);
- public static Werkstoff Strontium = new Werkstoff(Materials.Strontium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 44);
- public static Werkstoff Sulfur = new Werkstoff(Materials.Sulfur, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 22);
- public static Werkstoff Tantalum = new Werkstoff(Materials.Tantalum, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 80);
- public static Werkstoff Terbium = new Werkstoff(Materials.Terbium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 72);
- public static Werkstoff Thorium = new Werkstoff(Materials.Thorium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 96);
- public static Werkstoff Thulium = new Werkstoff(Materials.Thulium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 76);
- public static Werkstoff Tin = new Werkstoff(Materials.Tin, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 57);
- public static Werkstoff Titanium = new Werkstoff(Materials.Titanium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 28);
- public static Werkstoff Tritanium = new Werkstoff(Materials.Tritanium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 329);
- public static Werkstoff Tritium = new Werkstoff(Materials.Tritium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 3);
- public static Werkstoff Tungsten = new Werkstoff(Materials.Tungsten, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 81);
- public static Werkstoff Uranium = new Werkstoff(Materials.Uranium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 98);
- public static Werkstoff Uranium235 = new Werkstoff(Materials.Uranium235, ADD_CASINGS_ONLY, ISOTOPE, 31_766 + 97);
- public static Werkstoff Vanadium = new Werkstoff(Materials.Vanadium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 29);
- public static Werkstoff Ytterbium = new Werkstoff(Materials.Ytterbium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 77);
- public static Werkstoff Yttrium = new Werkstoff(Materials.Yttrium, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 45);
- public static Werkstoff Zinc = new Werkstoff(Materials.Zinc, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 36);
- public static Werkstoff Ardite = new Werkstoff(Materials.Ardite, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 382);
- public static Werkstoff Naquadah = new Werkstoff(Materials.Naquadah, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 324);
- public static Werkstoff NaquadahAlloy = new Werkstoff(
- Materials.NaquadahAlloy,
- ADD_CASINGS_ONLY,
- COMPOUND,
- 31_766 + 325);
- public static Werkstoff NaquadahEnriched = new Werkstoff(
- Materials.NaquadahEnriched,
- ADD_CASINGS_ONLY,
- ISOTOPE,
- 31_766 + 326);
- public static Werkstoff Naquadria = new Werkstoff(Materials.Naquadria, ADD_CASINGS_ONLY, ELEMENT, 31_766 + 327);
- public static Werkstoff WroughtIron = new Werkstoff(Materials.WroughtIron, ADD_CASINGS_ONLY, ISOTOPE, 31_766 + 304);
- public static Werkstoff AnnealedCopper = new Werkstoff(
- Materials.AnnealedCopper,
- ADD_CASINGS_ONLY,
- ISOTOPE,
- 31_766 + 345);
-
- public static Werkstoff Osmiridium = new Werkstoff(Materials.Osmiridium, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 317);
- public static Werkstoff SterlingSilver = new Werkstoff(
- Materials.SterlingSilver,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 350);
- public static Werkstoff RoseGold = new Werkstoff(Materials.RoseGold, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 351);
- public static Werkstoff BlackBronze = new Werkstoff(Materials.BlackBronze, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 352);
- public static Werkstoff BismuthBronze = new Werkstoff(
- Materials.BismuthBronze,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 353);
- public static Werkstoff BlackSteel = new Werkstoff(Materials.BlackSteel, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 334);
- public static Werkstoff RedSteel = new Werkstoff(Materials.RedSteel, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 348);
- public static Werkstoff BlueSteel = new Werkstoff(Materials.BlueSteel, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 349);
- public static Werkstoff DamascusSteel = new Werkstoff(
- Materials.DamascusSteel,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 335);
- public static Werkstoff TungstenSteel = new Werkstoff(
- Materials.TungstenSteel,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 316);
- public static Werkstoff Ultimet = new Werkstoff(Materials.Ultimet, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 344);
- public static Werkstoff TungstenCarbide = new Werkstoff(
- Materials.TungstenCarbide,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 370);
- public static Werkstoff VanadiumSteel = new Werkstoff(
- Materials.VanadiumSteel,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 371);
- public static Werkstoff HSSG = new Werkstoff(Materials.HSSG, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 372);
- public static Werkstoff HSSE = new Werkstoff(Materials.HSSE, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 373);
- public static Werkstoff HSSS = new Werkstoff(Materials.HSSS, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 374);
- public static Werkstoff StainlessSteel = new Werkstoff(
- Materials.StainlessSteel,
- ADD_CASINGS_ONLY,
- MIXTURE,
- 31_766 + 306);
- public static Werkstoff Brass = new Werkstoff(Materials.Brass, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 301);
- public static Werkstoff Bronze = new Werkstoff(Materials.Bronze, ADD_CASINGS_ONLY, MIXTURE, 31_766 + 300);
-
- public static Werkstoff Wood = new Werkstoff(Materials.Wood, ADD_CASINGS_ONLY, BIOLOGICAL, 31_766 + 809);
-
- public static Werkstoff Steel = new Werkstoff(Materials.Steel, ADD_CASINGS_ONLY, COMPOUND, 31_766 + 305);
- public static Werkstoff Polytetrafluoroethylene = new Werkstoff(
- Materials.Polytetrafluoroethylene,
- ADD_CASINGS_ONLY,
- COMPOUND,
- 31_766 + 473);
- public static Werkstoff Plastic = new Werkstoff(Materials.Plastic, ADD_CASINGS_ONLY, COMPOUND, 31_766 + 874);
- public static Werkstoff Epoxid = new Werkstoff(Materials.Epoxid, ADD_CASINGS_ONLY, COMPOUND, 31_766 + 470);
- public static Werkstoff Magnesia = new Werkstoff(
- Materials.Magnesia,
- new Werkstoff.GenerationFeatures().disable()
- .addMetalItems()
- .addMolten(),
- COMPOUND,
- 31_766 + 471);
-
- public static void init() {
- MainMod.LOGGER.info("Load Elements from GT");
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java
deleted file mode 100644
index 41f28d033a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.werkstoffHashMap;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.minecraft.block.Block;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.common.items.BW_ItemBlocks;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_Utility;
-
-public class BW_MetaGeneratedBlock_Item extends BW_ItemBlocks {
-
- public BW_MetaGeneratedBlock_Item(Block par1) {
- super(par1);
- }
-
- @Override
- public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side,
- float hitX, float hitY, float hitZ) {
- return false;
- }
-
- @Override
- public String getUnlocalizedName(ItemStack aStack) {
- return this.field_150939_a.getUnlocalizedName() + "." + this.getDamage(aStack);
- }
-
- @Override
- public String getItemStackDisplayName(ItemStack aStack) {
- Block block = Block.getBlockFromItem(aStack.getItem());
- if (block instanceof BW_MetaGenerated_Blocks metaBlock) {
- int aMetaData = aStack.getItemDamage();
- Werkstoff werkstoff = werkstoffHashMap.get((short) aMetaData);
- if (werkstoff == null) werkstoff = Werkstoff.default_null_Werkstoff;
- return metaBlock.blockTypeLocalizedName.replace("%material", werkstoff.getLocalizedName());
- }
- return GT_LanguageManager.getTranslation(this.getUnlocalizedName(aStack) + ".name");
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
- if (!GT_Utility.isStackValid(aStack) || aPlayer == null || aStack.getItemDamage() <= 0) {
- return;
- }
- if (aList == null) {
- aList = new ArrayList<>();
- }
- Werkstoff werkstoff = Werkstoff.werkstoffHashMap.get((short) aStack.getItemDamage());
- if (werkstoff != null) {
- String tooltip = werkstoff.getLocalizedToolTip();
- if (!tooltip.isEmpty()) {
- aList.add(tooltip);
- }
-
- String owner = werkstoff.getOwner();
- if (owner != null) {
- aList.add(BW_Tooltip_Reference.ADDED_VIA_BARTWORKS.apply(owner));
- } else {
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
- } else {
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
- }
-
- @Override
- public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, int side,
- float hitX, float hitY, float hitZ, int aMeta) {
- short tDamage = (short) this.getDamage(aStack);
- if (tDamage > 0) {
- if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tDamage, 3)) {
- return false;
- }
- BW_MetaGenerated_Block_TE tTileEntity = (BW_MetaGenerated_Block_TE) aWorld.getTileEntity(aX, aY, aZ);
- tTileEntity.mMetaData = tDamage;
- } 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;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java
deleted file mode 100644
index 6fb1650c1f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import java.util.List;
-import java.util.Optional;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.entity.Entity;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntity;
-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.OrePrefixes;
-
-public class BW_MetaGeneratedBlocks_Casing extends BW_MetaGenerated_Blocks
- implements com.gtnewhorizon.structurelib.structure.ICustomBlockSetting {
-
- public BW_MetaGeneratedBlocks_Casing(Material p_i45386_1_, Class<? extends TileEntity> tileEntity, String blockName,
- OrePrefixes prefixes) {
- super(p_i45386_1_, tileEntity, blockName, prefixes);
- }
-
- @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 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 void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
- super.onBlockAdded(aWorld, aX, aY, aZ);
- GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
- }
-
- @Override
- protected void doRegistrationStuff(Werkstoff tMaterial) {
- GregTech_API.registerMachineBlock(this, -1);
- }
-
- @Override
- public String getUnlocalizedName() {
- if (this._prefixes == OrePrefixes.blockCasing) return "bw.werkstoffblockscasing.01";
- if (this._prefixes == OrePrefixes.blockCasingAdvanced) return "bw.werkstoffblockscasingadvanced.01";
- return "";
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubBlocks(Item aItem, CreativeTabs aTab, List<ItemStack> aList) {
- Werkstoff.werkstoffHashSet.stream()
- .filter(
- pMaterial -> Werkstoff.Types.BIOLOGICAL.equals(pMaterial.getType())
- && pMaterial.hasGenerationFeature(OrePrefixes.blockCasing)
- || pMaterial.doesOreDictedItemExists(OrePrefixes.plate)
- && pMaterial.doesOreDictedItemExists(OrePrefixes.screw)
- && pMaterial.doesOreDictedItemExists(OrePrefixes.plateDouble)
- && pMaterial.doesOreDictedItemExists(OrePrefixes.gearGt)
- && pMaterial.doesOreDictedItemExists(OrePrefixes.gearGtSmall))
- .map(pMaterial -> new ItemStack(aItem, 1, pMaterial.getmID()))
- .forEach(aList::add);
- }
-
- /**
- * ICustomBlockSetting setBlock override
- */
- public void setBlock(World world, int x, int y, int z, int meta) {
- world.setBlock(x, y, z, this, meta, 2);
- try {
- Thread.sleep(1);
- // Fucking Minecraft TE settings.
- } catch (InterruptedException ignored) {}
- Optional.ofNullable(world.getTileEntity(x, y, z))
- .filter(te -> te instanceof BW_MetaGenerated_Block_TE)
- .map(te -> (BW_MetaGenerated_Block_TE) te)
- .ifPresent(te -> te.mMetaData = (short) meta);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java
deleted file mode 100644
index 02dd3c8f58..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.render.TextureFactory;
-
-public class BW_MetaGeneratedBlocks_CasingAdvanced_TE extends BW_MetaGenerated_Block_TE {
-
- @Override
- protected Block GetProperBlock() {
- return WerkstoffLoader.BWBlockCasingsAdvanced;
- }
-
- @Override
- public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
- if (SideReference.Side.Client) {
- Werkstoff aMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData);
- if (aMaterial != null) {
- TextureSet set = aMaterial.getTexSet();
- ITexture aIconSet = TextureFactory.of(
- PrefixTextureLinker.texMapBlocks.get(OrePrefixes.blockCasingAdvanced)
- .getOrDefault(set, TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex]),
- aMaterial.getRGBA());
- return new ITexture[] { TextureFactory.of(Blocks.iron_block), aIconSet };
- }
- }
- return new ITexture[] { TextureFactory.of(Blocks.iron_block),
- TextureFactory.of(gregtech.api.enums.TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex]) };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java
deleted file mode 100644
index af61e1a68a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.render.TextureFactory;
-
-public class BW_MetaGeneratedBlocks_Casing_TE extends BW_MetaGenerated_Block_TE {
-
- @Override
- protected Block GetProperBlock() {
- return WerkstoffLoader.BWBlockCasings;
- }
-
- @Override
- public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
- if (SideReference.Side.Client) {
- Werkstoff aMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData);
- if (aMaterial != null) {
- TextureSet set = aMaterial.getTexSet();
- ITexture aIconSet = TextureFactory.of(
- PrefixTextureLinker.texMapBlocks.get(OrePrefixes.blockCasing)
- .getOrDefault(set, TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex]),
- aMaterial.getRGBA());
- return new ITexture[] { TextureFactory.of(Blocks.iron_block), aIconSet };
- }
- }
- return new ITexture[] { TextureFactory.of(Blocks.iron_block),
- TextureFactory.of(gregtech.api.enums.TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex]) };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java
deleted file mode 100644
index ee5a0a1511..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static gregtech.api.enums.GT_Values.RA;
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-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.ItemList;
-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.MetaPipeEntity;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_ModHandler.RecipeBits;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class BW_MetaGeneratedFrames extends MetaPipeEntity {
-
- public final Werkstoff mMaterial;
-
- public BW_MetaGeneratedFrames(int aID, String aName, String aNameRegional, Werkstoff aMaterial) {
- super(aID, aName, aNameRegional, 0);
- this.mMaterial = aMaterial;
-
- GT_OreDictUnificator.registerOre(OrePrefixes.frameGt, aMaterial, this.getStackForm(1));
- GT_ModHandler.addCraftingRecipe(
- this.getStackForm(2),
- RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "SSS", "SwS", "SSS", 'S', this.mMaterial.get(OrePrefixes.stick) });
-
- RA.stdBuilder()
- .itemInputs(
- GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.getVarName(), 4),
- ItemList.Circuit_Integrated.getWithDamage(0, 4))
- .itemOutputs(getStackForm(1))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(8)
- .addTo(assemblerRecipes);
- }
-
- private BW_MetaGeneratedFrames(String aName, Werkstoff aMaterial) {
- super(aName, 0);
- this.mMaterial = aMaterial;
- }
-
- @Override
- public byte getTileEntityBaseType() {
- return 4;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new BW_MetaGeneratedFrames(this.mName, this.mMaterial);
- }
-
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, byte aConnections,
- int aColorIndex, boolean aConnected, boolean aRedstone) {
- return new ITexture[] { TextureFactory.of(
- this.mMaterial.getTexSet().mTextures[OrePrefixes.frameGt.mTextureIndex],
- Dyes.getModulation(aColorIndex, this.mMaterial.getRGBA())) };
- }
-
- @Override
- public String[] getDescription() {
- return new String[] { "Just something you can put a Cover or CFoam on." };
- }
-
- @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 */
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java
deleted file mode 100644
index 9b393dff0f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-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.minecraftforge.common.util.ForgeDirection;
-
-import gregtech.GT_Mod;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class BW_MetaGeneratedOreTE extends BW_MetaGenerated_Block_TE {
-
- protected static boolean shouldFortune = false;
- protected static boolean shouldSilkTouch = false;
- public boolean mNatural = false;
-
- @Override
- public void readFromNBT(NBTTagCompound aNBT) {
- super.readFromNBT(aNBT);
- this.mNatural = aNBT.getBoolean("n");
- }
-
- @Override
- public void writeToNBT(NBTTagCompound aNBT) {
- super.writeToNBT(aNBT);
- aNBT.setBoolean("n", this.mNatural);
- }
-
- @Override
- public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
- Werkstoff aMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData);
- if (aMaterial != null) {
- ITexture aIconSet = TextureFactory
- .of(aMaterial.getTexSet().mTextures[OrePrefixes.ore.mTextureIndex], aMaterial.getRGBA());
- return new ITexture[] { TextureFactory.of(Blocks.stone), aIconSet };
- }
- return new ITexture[] { TextureFactory.of(Blocks.stone),
- TextureFactory.of(gregtech.api.enums.TextureSet.SET_NONE.mTextures[OrePrefixes.ore.mTextureIndex]) };
- }
-
- @Override
- protected Block GetProperBlock() {
- return WerkstoffLoader.BWOres;
- }
-
- @Override
- public ArrayList<ItemStack> getDrops(int aFortune) {
- ArrayList<ItemStack> rList = new ArrayList<>();
- if (this.mMetaData <= 0) {
- rList.add(new ItemStack(Blocks.cobblestone, 1, 0));
- return rList;
- }
- Materials aOreMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData)
- .getBridgeMaterial();
- if (shouldSilkTouch) {
- rList.add(new ItemStack(this.GetProperBlock(), 1, this.mMetaData));
- } else {
- switch (GT_Mod.gregtechproxy.oreDropSystem) {
- case Item -> {
- rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 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 && this.mNatural && aFortune > 0) {
- int aMinAmount = 1;
- // Max applicable fortune
- if (aFortune > 3) aFortune = 3;
- long amount = (long) new Random().nextInt(aFortune) + aMinAmount;
- for (int i = 0; i < amount; i++) {
- rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1));
- }
- } else {
- rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1));
- }
- }
- case UnifiedBlock -> {
- // Unified ore
- rList.add(new ItemStack(this.GetProperBlock(), 1, this.mMetaData));
- }
- case PerDimBlock -> {
- // Per Dimension ore
- rList.add(new ItemStack(this.GetProperBlock(), 1, this.mMetaData));
- }
- case Block -> {
- // Regular ore
- rList.add(new ItemStack(this.GetProperBlock(), 1, this.mMetaData));
- }
- }
- }
- return rList;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java
deleted file mode 100644
index 110b17321f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-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.minecraftforge.common.util.ForgeDirection;
-
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.objects.XSTR;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-
-public class BW_MetaGeneratedSmallOreTE extends BW_MetaGeneratedOreTE {
-
- @Override
- public ArrayList<ItemStack> getDrops(int aFortune) {
- ArrayList<ItemStack> rList = new ArrayList<>();
- Materials aMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData)
- .getBridgeMaterial();
-
- if (aMaterial != null) {
- Random tRandom = new XSTR(this.xCoord ^ this.yCoord ^ this.zCoord);
- ArrayList<ItemStack> tSelector = new ArrayList<>();
-
- 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.size() > 0) {
- int i = 0;
-
- for (int j = Math.max(1, aFortune > 0 ? tRandom.nextInt(1 + aFortune) : 0); i < j; ++i) {
- rList.add(GT_Utility.copyAmount(1L, tSelector.get(tRandom.nextInt(tSelector.size()))));
- }
- }
- if (tRandom.nextInt(3 + aFortune) > 1) {
- rList.add(
- GT_OreDictUnificator
- .get(tRandom.nextInt(3) > 0 ? OrePrefixes.dustImpure : OrePrefixes.dust, Materials.Stone, 1L));
- }
- }
- return rList;
- }
-
- @Override
- public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
- Werkstoff aMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData);
- if (aMaterial != null) {
- ITexture aIconSet = TextureFactory
- .of(aMaterial.getTexSet().mTextures[OrePrefixes.oreSmall.mTextureIndex], aMaterial.getRGBA());
- return new ITexture[] { TextureFactory.of(Blocks.stone), aIconSet };
- }
- return new ITexture[] { TextureFactory.of(Blocks.stone),
- TextureFactory.of(gregtech.api.enums.TextureSet.SET_NONE.mTextures[OrePrefixes.oreSmall.mTextureIndex]) };
- }
-
- @Override
- protected Block GetProperBlock() {
- return WerkstoffLoader.BWSmallOres;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java
deleted file mode 100644
index 77d3c23fbc..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static com.github.bartimaeusnek.bartworks.MainMod.BW_Network_instance;
-
-import java.util.ArrayList;
-
-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 com.github.bartimaeusnek.bartworks.common.net.MetaBlockPacket;
-
-import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
-
-public abstract class BW_MetaGenerated_Block_TE extends TileEntity implements ITexturedTileEntity {
-
- public short mMetaData;
-
- @Override
- public boolean canUpdate() {
- return false;
- }
-
- @Override
- public void readFromNBT(NBTTagCompound aNBT) {
- super.readFromNBT(aNBT);
- this.mMetaData = aNBT.getShort("m");
- }
-
- @Override
- public void writeToNBT(NBTTagCompound aNBT) {
- super.writeToNBT(aNBT);
- aNBT.setShort("m", this.mMetaData);
- }
-
- @Override
- public Packet getDescriptionPacket() {
- if (!this.worldObj.isRemote) BW_Network_instance.sendPacketToAllPlayersInRange(
- this.worldObj,
- new MetaBlockPacket(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData),
- this.xCoord,
- this.zCoord);
- return null;
- }
-
- protected abstract Block GetProperBlock();
-
- public ArrayList<ItemStack> getDrops(int aFortune) {
- ArrayList<ItemStack> rList = new ArrayList<>();
- if (this.mMetaData <= 0) {
- rList.add(new ItemStack(Blocks.cobblestone, 1, 0));
- return rList;
- }
- rList.add(new ItemStack(this.GetProperBlock(), 1, this.mMetaData));
- return rList;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java
deleted file mode 100644
index 84a498070a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Items.metaTab;
-
-import java.util.ArrayList;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.ITileEntityProvider;
-import net.minecraft.block.material.Material;
-import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.client.renderer.BW_Renderer_Block_Ores;
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_TileEntityContainer;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_LanguageManager;
-
-public abstract class BW_MetaGenerated_Blocks extends BW_TileEntityContainer {
-
- public static ThreadLocal<BW_MetaGenerated_Block_TE> mTemporaryTileEntity = new ThreadLocal<>();
- protected OrePrefixes _prefixes;
- protected String blockTypeLocalizedName;
-
- public BW_MetaGenerated_Blocks(Material p_i45386_1_, Class<? extends TileEntity> tileEntity, String blockName) {
- this(p_i45386_1_, tileEntity, blockName, null);
- }
-
- public BW_MetaGenerated_Blocks(Material p_i45386_1_, Class<? extends TileEntity> tileEntity, String blockName,
- OrePrefixes types) {
- super(p_i45386_1_, tileEntity, blockName);
- this.setHardness(5.0F);
- this.setResistance(5.0F);
- this.setBlockTextureName("stone");
- this.setCreativeTab(metaTab);
- this._prefixes = types;
- if (this._prefixes != null) {
- this.blockTypeLocalizedName = GT_LanguageManager.addStringLocalization(
- "bw.blocktype." + this._prefixes,
- this._prefixes.mLocalizedMaterialPre + "%material" + this._prefixes.mLocalizedMaterialPost);
- }
- Werkstoff.werkstoffHashSet.forEach(this::doRegistrationStuff);
- }
-
- @Override
- public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
- super.onBlockAdded(aWorld, aX, aY, aZ);
- // Waste some time to allow the TE to be set, do not use thread sleep here, it doesnt allow for nanoseconds.
- // This will just waste a few cpu cycles to allow the TE to be set
- BW_Util.shortSleep(0);
- }
-
- @SideOnly(Side.CLIENT)
- public final BW_MetaGenerated_Block_TE getProperTileEntityForRendering() {
- return (BW_MetaGenerated_Block_TE) this.createNewTileEntity(null, 0);
- }
-
- protected abstract void doRegistrationStuff(Werkstoff w);
-
- @Override
- public String getHarvestTool(int metadata) {
- return "pickaxe";
- }
-
- @Override
- protected boolean canSilkHarvest() {
- return false;
- }
-
- @Override
- public int getRenderType() {
- if (BW_Renderer_Block_Ores.INSTANCE == null) return super.getRenderType();
- return BW_Renderer_Block_Ores.INSTANCE.renderID;
- }
-
- @Override
- public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
- TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- if (tTileEntity instanceof BW_MetaGenerated_Block_TE metaTE) {
- return metaTE.mMetaData;
- }
- return 0;
- }
-
- @Override
- public TileEntity createTileEntity(World world, int metadata) {
- return ((ITileEntityProvider) this).createNewTileEntity(world, metadata);
- }
-
- @Override
- public boolean hasTileEntity(int metadata) {
- return true;
- }
-
- @Override
- public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
- TileEntity tTileEntity = world.getTileEntity(x, y, z);
- if (tTileEntity instanceof BW_MetaGenerated_Block_TE metaTE) {
- mTemporaryTileEntity.set(metaTE);
- }
- super.breakBlock(world, x, y, z, block, meta);
- }
-
- @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 BW_MetaGenerated_Block_TE metaTE) {
- return metaTE.getDrops(aFortune);
- }
- return mTemporaryTileEntity.get() == null ? new ArrayList<>()
- : mTemporaryTileEntity.get()
- .getDrops(aFortune);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java
deleted file mode 100644
index 4c355284ae..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.werkstoffHashMap;
-import static com.github.bartimaeusnek.bartworks.system.material.Werkstoff.werkstoffHashSet;
-
-import java.util.List;
-
-import net.minecraft.block.Block;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.item.EntityItem;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.potion.Potion;
-import net.minecraft.potion.PotionEffect;
-import net.minecraft.util.IIcon;
-import net.minecraft.util.MathHelper;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.API.IRadMaterial;
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-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_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import ic2.core.IC2Potion;
-
-public class BW_MetaGenerated_Items extends GT_MetaGenerated_Item implements IRadMaterial {
-
- public static final CreativeTabs metaTab = new CreativeTabs("bartworksMetaMaterials") {
-
- @Override
- public Item getTabIconItem() {
- return new ItemStack(Blocks.iron_ore).getItem();
- }
- };
-
- protected final OrePrefixes orePrefixes;
- protected final String itemTypeLocalizedName;
-
- public BW_MetaGenerated_Items(OrePrefixes orePrefixes, Object unused) {
- super("bwMetaGeneratedGTEnhancement" + orePrefixes.name(), (short) 32766, (short) 0);
- this.orePrefixes = orePrefixes;
- this.itemTypeLocalizedName = GT_LanguageManager.addStringLocalization(
- "bw.itemtype." + orePrefixes,
- orePrefixes.mLocalizedMaterialPre + "%material" + orePrefixes.mLocalizedMaterialPost);
- }
-
- public BW_MetaGenerated_Items(OrePrefixes orePrefixes) {
- super("bwMetaGenerated" + orePrefixes.name(), (short) 32766, (short) 0);
- this.orePrefixes = orePrefixes;
- this.itemTypeLocalizedName = GT_LanguageManager.addStringLocalization(
- "bw.itemtype." + orePrefixes,
- orePrefixes.mLocalizedMaterialPre + "%material" + orePrefixes.mLocalizedMaterialPost);
- this.setCreativeTab(BW_MetaGenerated_Items.metaTab);
- for (Werkstoff w : werkstoffHashSet) {
- ItemStack tStack = new ItemStack(this, 1, w.getmID());
- if (!w.hasItemType(this.orePrefixes)) continue;
- GT_OreDictUnificator.registerOre(this.orePrefixes.name() + w.getVarName(), tStack);
- }
- }
-
- @Override
- public boolean onEntityItemUpdate(EntityItem aItemEntity) {
- if (this.orePrefixes == OrePrefixes.dustImpure || this.orePrefixes == OrePrefixes.dustPure
- || this.orePrefixes == OrePrefixes.crushed) {
- int aDamage = aItemEntity.getEntityItem()
- .getItemDamage();
- if (aDamage >= 0 && !aItemEntity.worldObj.isRemote) {
- Werkstoff aMaterial = werkstoffHashMap.get((short) aDamage);
- if (aMaterial != null && aMaterial != Werkstoff.default_null_Werkstoff) {
- int tX = MathHelper.floor_double(aItemEntity.posX);
- int tY = MathHelper.floor_double(aItemEntity.posY);
- int tZ = MathHelper.floor_double(aItemEntity.posZ);
- Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ);
- byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ);
- if (tBlock == Blocks.cauldron && tMetaData > 0) {
- if (this.orePrefixes == OrePrefixes.dustImpure || this.orePrefixes == OrePrefixes.dustPure) {
- aItemEntity.setEntityItemStack(
- WerkstoffLoader.getCorrespondingItemStack(
- OrePrefixes.dust,
- aMaterial,
- aItemEntity.getEntityItem().stackSize));
- aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3);
- return true;
- } else {
- aItemEntity.setEntityItemStack(
- WerkstoffLoader.getCorrespondingItemStack(
- OrePrefixes.crushedPurified,
- aMaterial,
- 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) {
- if (this.orePrefixes == OrePrefixes.dustImpure || this.orePrefixes == OrePrefixes.dustPure) {
- aList.add(GT_LanguageManager.getTranslation("metaitem.01.tooltip.purify"));
- }
- if (this.orePrefixes == OrePrefixes.crushed)
- aList.add(GT_LanguageManager.getTranslation("metaitem.01.tooltip.purify.2"));
-
- if (aStack != null && aStack.getItem() instanceof BW_MetaGenerated_Items
- && aStack.getItemDamage() == WerkstoffLoader.Tiberium.getmID())
- aList.add(GT_LanguageManager.getTranslation("metaitem.01.tooltip.nqgen"));
-
- Werkstoff werkstoff = werkstoffHashMap.get((short) this.getDamage(aStack));
- if (werkstoff != null) {
- String tooltip = werkstoff.getLocalizedToolTip();
- if (!tooltip.isEmpty()) {
- aList.add(tooltip);
- }
-
- String owner = werkstoff.getOwner();
- if (owner != null) {
- aList.add(BW_Tooltip_Reference.ADDED_VIA_BARTWORKS.apply(owner));
- } else {
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
- } else {
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
- }
-
- @Override
- public String getItemStackDisplayName(ItemStack aStack) {
- int aMetaData = aStack.getItemDamage();
- Werkstoff werkstoff = werkstoffHashMap.get((short) aMetaData);
- if (werkstoff == null) werkstoff = Werkstoff.default_null_Werkstoff;
- return this.itemTypeLocalizedName.replace("%material", werkstoff.getLocalizedName());
- }
-
- @Override
- public IIconContainer getIconContainer(int aMetaData) {
- if (werkstoffHashMap.get((short) aMetaData) == null) return null;
- if (this.orePrefixes.mTextureIndex == -1) return this.getIconContainerBartWorks(aMetaData);
- return werkstoffHashMap.get((short) aMetaData)
- .getTexSet().mTextures[this.orePrefixes.mTextureIndex];
- }
-
- protected IIconContainer getIconContainerBartWorks(int aMetaData) {
- if (SideReference.Side.Client) return PrefixTextureLinker.texMap.get(this.orePrefixes)
- .get(
- werkstoffHashMap.get((short) aMetaData)
- .getTexSet());
- return null;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubItems(Item var1, CreativeTabs aCreativeTab, List<ItemStack> aList) {
- for (Werkstoff werkstoff : werkstoffHashSet) {
- if (werkstoff != null && werkstoff.hasItemType(this.orePrefixes)) {
- ItemStack tStack = new ItemStack(this, 1, werkstoff.getmID());
- aList.add(tStack);
- }
- }
- // super.getSubItems(var1, aCreativeTab, aList);
- }
-
- @Override
- public short[] getRGBa(ItemStack aStack) {
- Werkstoff werkstoff = werkstoffHashMap.get((short) this.getDamage(aStack));
- return werkstoff == null ? Materials._NULL.mRGBa : werkstoff.getRGBA();
- }
-
- @Override
- public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) {
- super.onUpdate(aStack, aWorld, aPlayer, aTimer, aIsInHand);
- if (aStack == null || aStack.getItem() == null || !(aPlayer instanceof EntityLivingBase)) return;
-
- EntityLivingBase bPlayer = (EntityPlayer) aPlayer;
- Werkstoff w = werkstoffHashMap.get((short) aStack.getItemDamage());
- if (w == null || w.getStats() == null) return;
-
- if (w.getStats()
- .isToxic() && !GT_Utility.isWearingFullBioHazmat(bPlayer)) {
- bPlayer.addPotionEffect(new PotionEffect(Potion.poison.getId(), 80, 4));
- }
-
- if (w.getStats()
- .isRadioactive() && !GT_Utility.isWearingFullRadioHazmat(bPlayer)) {
- bPlayer.addPotionEffect(new PotionEffect(IC2Potion.radiation.id, 80, 4));
- }
- }
-
- @Override
- public IIcon getIconFromDamage(int aMetaData) {
- if (aMetaData < 0) return null;
- Werkstoff tMaterial = werkstoffHashMap.get((short) aMetaData);
- if (tMaterial == null) return null;
- IIconContainer tIcon = this.getIconContainer(aMetaData);
- if (tIcon != null) return tIcon.getIcon();
- return null;
- }
-
- @Override
- public int getItemStackLimit(ItemStack aStack) {
- return this.orePrefixes.mDefaultStackSize;
- }
-
- @Override
- public int getRadiationLevel(ItemStack aStack) {
- Werkstoff w = werkstoffHashMap.get((short) aStack.getItemDamage());
- return w.getStats()
- .isRadioactive()
- ? (int) w.getStats()
- .getProtons()
- : 0;
- }
-
- @Override
- public byte getAmountOfMaterial(ItemStack aStack) {
- return (byte) (this.orePrefixes == OrePrefixes.stick ? 1 : this.orePrefixes == OrePrefixes.stickLong ? 2 : 0);
- }
-
- @Override
- public short[] getColorForGUI(ItemStack aStack) {
- Werkstoff w = werkstoffHashMap.get((short) aStack.getItemDamage());
- return w.getRGBA();
- }
-
- @Override
- public String getNameForGUI(ItemStack aStack) {
- Werkstoff w = werkstoffHashMap.get((short) aStack.getItemDamage());
- return w.getDefaultName();
- }
-
- @Override
- public int getCapacity(ItemStack aStack) {
- return this.orePrefixes == OrePrefixes.capsule || this.orePrefixes == OrePrefixes.cell
- || this.orePrefixes == OrePrefixes.cellPlasma ? 1000
- : this.orePrefixes == OrePrefixes.cellMolten || this.orePrefixes == OrePrefixes.capsuleMolten ? 144 : 0;
- }
-
- @Override
- public ItemStack getContainerItem(ItemStack aStack) {
- return this.orePrefixes == OrePrefixes.cell || this.orePrefixes == OrePrefixes.cellPlasma
- || this.orePrefixes == OrePrefixes.cellMolten ? Materials.Empty.getCells(1) : null;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java
deleted file mode 100644
index 2adb0d3d35..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import java.util.Arrays;
-import java.util.List;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.enchantment.EnchantmentHelper;
-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.world.IBlockAccess;
-import net.minecraft.world.World;
-import net.minecraftforge.common.util.FakePlayer;
-
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_ModHandler;
-
-public class BW_MetaGenerated_Ores extends BW_MetaGenerated_Blocks {
-
- public BW_MetaGenerated_Ores(Material p_i45386_1_, Class<? extends TileEntity> tileEntity, String blockName) {
- super(p_i45386_1_, tileEntity, blockName);
- this.blockTypeLocalizedName = GT_LanguageManager.addStringLocalization(
- "bw.blocktype." + OrePrefixes.ore,
- OrePrefixes.ore.mLocalizedMaterialPre + "%material" + OrePrefixes.ore.mLocalizedMaterialPost);
- }
-
- @Override
- protected void doRegistrationStuff(Werkstoff w) {
- if (w != null) {
- if (!w.hasItemType(OrePrefixes.ore) || (w.getGenerationFeatures().blacklist & 0b1000) != 0) return;
- GT_ModHandler.addValuableOre(this, w.getmID(), 1);
- }
- }
-
- public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean air, Block block,
- int[] aBlockMeta) {
- if (!air) {
- aY = MathUtils.clamp(aY, 1, aWorld.getActualHeight());
- }
-
- Block tBlock = aWorld.getBlock(aX, aY, aZ);
- Block tOreBlock = WerkstoffLoader.BWOres;
- if (aMetaData < 0 || tBlock == Blocks.air && !air
- || Block.getIdFromBlock(tBlock) != Block.getIdFromBlock(block)) {
- return false;
- }
- final int aaY = aY;
- if (Arrays.stream(aBlockMeta)
- .noneMatch(e -> e == aWorld.getBlockMetadata(aX, aaY, aZ))) {
- return false;
- }
-
- aWorld.setBlock(aX, aY, aZ, tOreBlock, aMetaData, 0);
- TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- if (tTileEntity instanceof BW_MetaGeneratedOreTE metaTE) {
- metaTE.mMetaData = (short) aMetaData;
- metaTE.mNatural = true;
- }
-
- return true;
- }
-
- @Override
- public IIcon getIcon(int side, int meta) {
- return Blocks.stone.getIcon(0, 0);
- }
-
- @Override
- public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) {
- return Blocks.stone.getIcon(0, 0);
- }
-
- @Override
- public int getHarvestLevel(int metadata) {
- return 3;
- }
-
- @Override
- public String getUnlocalizedName() {
- return "bw.blockores.01";
- }
-
- @Override
- public void getSubBlocks(Item aItem, CreativeTabs aTab, List<ItemStack> aList) {
- for (Werkstoff tMaterial : Werkstoff.werkstoffHashSet) {
- if (tMaterial != null && tMaterial.hasItemType(OrePrefixes.ore)
- && (tMaterial.getGenerationFeatures().blacklist & 0x8) == 0) {
- aList.add(new ItemStack(aItem, 1, tMaterial.getmID()));
- }
- }
- }
-
- @Override
- public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) {
- if (EnchantmentHelper.getSilkTouchModifier(player)) {
- BW_MetaGeneratedOreTE.shouldSilkTouch = true;
- super.harvestBlock(worldIn, player, x, y, z, meta);
-
- if (BW_MetaGeneratedOreTE.shouldSilkTouch) {
- BW_MetaGeneratedOreTE.shouldSilkTouch = false;
- }
- return;
- }
-
- if (!(player instanceof FakePlayer)) {
- BW_MetaGeneratedOreTE.shouldFortune = true;
- }
- super.harvestBlock(worldIn, player, x, y, z, meta);
- if (BW_MetaGeneratedOreTE.shouldFortune) {
- BW_MetaGeneratedOreTE.shouldFortune = false;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java
deleted file mode 100644
index 0778645cb5..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import java.util.Arrays;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.init.Blocks;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.world.World;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_ModHandler;
-
-public class BW_MetaGenerated_SmallOres extends BW_MetaGenerated_Ores {
-
- public BW_MetaGenerated_SmallOres(Material p_i45386_1_, Class<? extends TileEntity> tileEntity, String blockName) {
- super(p_i45386_1_, tileEntity, blockName);
- this.blockTypeLocalizedName = GT_LanguageManager.addStringLocalization(
- "bw.blocktype." + OrePrefixes.oreSmall,
- OrePrefixes.oreSmall.mLocalizedMaterialPre + "%material" + OrePrefixes.oreSmall.mLocalizedMaterialPost);
- }
-
- @Override
- protected void doRegistrationStuff(Werkstoff w) {
- if (w != null) {
- if (!w.hasItemType(OrePrefixes.ore) || (w.getGenerationFeatures().blacklist & 0b1000) != 0) return;
- GT_ModHandler.addValuableOre(this, w.getmID(), 1);
- }
- }
-
- @Override
- public String getUnlocalizedName() {
- return "bw.blockores.02";
- }
-
- public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean air, Block block,
- int[] aBlockMeta) {
- if (!air) {
- aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1));
- }
-
- Block tBlock = aWorld.getBlock(aX, aY, aZ);
- Block tOreBlock = WerkstoffLoader.BWSmallOres;
- if (aMetaData < 0 || tBlock == Blocks.air && !air
- || Block.getIdFromBlock(tBlock) != Block.getIdFromBlock(block)) {
- return false;
- }
- final int aaY = aY;
- if (Arrays.stream(aBlockMeta)
- .noneMatch(e -> e == aWorld.getBlockMetadata(aX, aaY, aZ))) {
- return false;
- }
-
- aWorld.setBlock(aX, aY, aZ, tOreBlock, aMetaData, 0);
- TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- if (tTileEntity instanceof BW_MetaGeneratedOreTE metaTE) {
- metaTE.mMetaData = (short) aMetaData;
- }
-
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java
deleted file mode 100644
index 4456a66535..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.render.TextureFactory;
-
-public class BW_MetaGenerated_WerkstoffBlock_TE extends BW_MetaGenerated_Block_TE {
-
- @Override
- public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
- if (SideReference.Side.Client) {
- Werkstoff aMaterial = Werkstoff.werkstoffHashMap.get(this.mMetaData);
- if (aMaterial != null) {
- TextureSet set = aMaterial.getTexSet();
- ITexture aIconSet = TextureFactory.of(
- set.mTextures[PrefixTextureLinker.blockTexMap.getOrDefault(set, OrePrefixes.block.mTextureIndex)],
- aMaterial.getRGBA());
- return new ITexture[] { TextureFactory.of(Blocks.iron_block), aIconSet };
- }
- }
- return new ITexture[] { TextureFactory.of(Blocks.iron_block),
- TextureFactory.of(gregtech.api.enums.TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex]) };
- }
-
- @Override
- protected Block GetProperBlock() {
- return WerkstoffLoader.BWBlocks;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java
deleted file mode 100644
index 648f9a0027..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import java.util.List;
-
-import net.minecraft.block.material.Material;
-import net.minecraft.creativetab.CreativeTabs;
-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.world.IBlockAccess;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_LanguageManager;
-
-public class BW_MetaGenerated_WerkstoffBlocks extends BW_MetaGenerated_Blocks {
-
- public BW_MetaGenerated_WerkstoffBlocks(Material p_i45386_1_, Class<? extends TileEntity> tileEntity,
- String blockName) {
- super(p_i45386_1_, tileEntity, blockName);
- this.blockTypeLocalizedName = GT_LanguageManager.addStringLocalization(
- "bw.blocktype." + OrePrefixes.block,
- OrePrefixes.block.mLocalizedMaterialPre + "%material" + OrePrefixes.block.mLocalizedMaterialPost);
- }
-
- @Override
- protected void doRegistrationStuff(Werkstoff tMaterial) {}
-
- @Override
- public String getUnlocalizedName() {
- return "bw.werkstoffblocks.01";
- }
-
- @Override
- public IIcon getIcon(int side, int meta) {
- return Blocks.iron_block.getIcon(0, 0);
- }
-
- @Override
- public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) {
- return Blocks.iron_block.getIcon(0, 0);
- }
-
- @Override
- public void getSubBlocks(Item aItem, CreativeTabs tab, List<ItemStack> aList) {
- Werkstoff.werkstoffHashSet.stream()
- .filter(tMaterial -> tMaterial.hasItemType(OrePrefixes.gem) || tMaterial.hasItemType(OrePrefixes.ingot))
- .map(tMaterial -> new ItemStack(aItem, 1, tMaterial.getmID()))
- .forEach(aList::add);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java
deleted file mode 100644
index db53437858..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-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 BW_NonMeta_MaterialItems implements IItemContainer {
-
- Depleted_Tiberium_1,
- Depleted_Tiberium_2,
- Depleted_Tiberium_4,
- TiberiumCell_1,
- TiberiumCell_2,
- TiberiumCell_4,
- TheCoreCell,
- Depleted_TheCoreCell;
-
- private ItemStack mStack;
- private boolean mHasNotBeenSet = true;
-
- @Override
- public IItemContainer set(Item aItem) {
- this.mHasNotBeenSet = false;
- if (aItem == null) return this;
- ItemStack aStack = new ItemStack(aItem, 1, 0);
- this.mStack = GT_Utility.copyAmount(1, aStack);
- return this;
- }
-
- @Override
- public IItemContainer set(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 GT_Utility.getBlockFromItem(this.getItem());
- }
-
- @Override
- public final boolean hasBeenSet() {
- return !this.mHasNotBeenSet;
- }
-
- @Override
- public boolean isStackEqual(Object aStack) {
- return this.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 ? this.getWildcard(1) : this.get(1), aIgnoreNBT);
- }
-
- @Override
- public ItemStack get(long aAmount, 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(long aAmount, 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(long aAmount, 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(long aAmount, 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(long aAmount, String aDisplayName, Object... aReplacements) {
- 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(long aAmount, int aEnergy, Object... aReplacements) {
- 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(long aAmount, long aMetaValue, 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 IItemContainer registerOre(Object... aOreNames) {
- if (this.mHasNotBeenSet)
- throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
- for (Object tOreName : aOreNames) GT_OreDictUnificator.registerOre(tOreName, this.get(1));
- return this;
- }
-
- @Override
- public IItemContainer registerWildcardAsOre(Object... aOreNames) {
- if (this.mHasNotBeenSet)
- throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
- for (Object tOreName : aOreNames) GT_OreDictUnificator.registerOre(tOreName, this.getWildcard(1));
- return this;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java
deleted file mode 100644
index 6bd186a050..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration;
-
-public class BW_CircuitsLoader {
-
- private static final BW_Meta_Items NEW_CIRCUITS = new BW_Meta_Items();
-
- private BW_CircuitsLoader() {}
-
- public static BW_Meta_Items getNewCircuits() {
- return BW_CircuitsLoader.NEW_CIRCUITS;
- }
-
- public static void initNewCircuits() {
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(0, 4, "Primitive Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(1, 5, "Basic Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(2, 6, "Good Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(3, 7, "Advanced Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(4, 8, "Data Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(5, 9, "Elite Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(6, 10, "Master Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(7, 11, "Ultimate Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(8, 12, "Superconductor Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(9, 13, "Infinite Magneto Resonatic Circuit");
- BW_CircuitsLoader.NEW_CIRCUITS.addNewCircuit(10, 14, "Bio Magneto Resonatic Circuit");
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java
deleted file mode 100644
index 99eb6e7d7e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration;
-
-import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-
-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.IIcon;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-
-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.enums.SubTag;
-import gregtech.api.enums.TC_Aspects;
-import gregtech.api.enums.TierEU;
-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.recipe.RecipeMaps;
-import gregtech.api.util.GT_Config;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
-
-public class BW_Meta_Items {
-
- public static BW_Meta_Items.BW_GT_MetaGenCircuits getNEWCIRCUITS() {
- return BW_Meta_Items.NEWCIRCUITS;
- }
-
- private static final BW_Meta_Items.BW_GT_MetaGenCircuits NEWCIRCUITS = new BW_Meta_Items.BW_GT_MetaGenCircuits();
-
- static {
- BW_Meta_Items.NEWCIRCUITS.addItem(0, "Circuit Imprint", "", SubTag.NO_UNIFICATION, SubTag.NO_RECYCLING);
- BW_Meta_Items.NEWCIRCUITS.addItem(1, "Sliced Circuit", "", SubTag.NO_UNIFICATION, SubTag.NO_RECYCLING);
- BW_Meta_Items.NEWCIRCUITS.addItem(2, "Raw Imprint supporting Board", "A Raw Board needed for Circuit Imprints");
- BW_Meta_Items.NEWCIRCUITS.addItem(3, "Imprint supporting Board", "A Board needed for Circuit Imprints");
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- WerkstoffLoader.MagnetoResonaticDust.get(OrePrefixes.dust, 1),
- WerkstoffLoader.ArInGaPhoBiBoTe.get(OrePrefixes.dust, 4))
- .itemOutputs(BW_Meta_Items.NEWCIRCUITS.getStack(2))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(formingPressRecipes);
-
- RecipeMaps.autoclaveRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.NEWCIRCUITS.getStack(2) },
- new ItemStack[] { BW_Meta_Items.NEWCIRCUITS.getStack(3) },
- null,
- new int[] { 7500 },
- new FluidStack[] { Materials.SolderingAlloy.getMolten(576) },
- null,
- 300,
- (int) TierEU.RECIPE_EV,
- BW_Util.CLEANROOM));
- }
-
- public void addNewCircuit(int aTier, int aID, String aName) {
-
- String additionalOreDictData = "";
- String tooltip = "";
- String aOreDictPrefix = OrePrefixes.circuit.toString();
- switch (aTier) {
- case 0:
- additionalOreDictData = Materials.Primitive.toString();
- tooltip = Materials.Primitive.getToolTip();
- break;
- case 1:
- additionalOreDictData = Materials.Basic.toString();
- tooltip = Materials.Basic.getToolTip();
- break;
- case 2:
- additionalOreDictData = Materials.Good.toString();
- tooltip = Materials.Good.getToolTip();
- break;
- case 3:
- additionalOreDictData = Materials.Advanced.toString();
- tooltip = Materials.Advanced.getToolTip();
- break;
- case 4:
- additionalOreDictData = Materials.Data.toString();
- tooltip = Materials.Data.getToolTip();
- break;
- case 5:
- additionalOreDictData = Materials.Elite.toString();
- tooltip = Materials.Elite.getToolTip();
- break;
- case 6:
- additionalOreDictData = Materials.Master.toString();
- tooltip = Materials.Master.getToolTip();
- break;
- case 7:
- additionalOreDictData = Materials.Ultimate.toString();
- tooltip = Materials.Ultimate.getToolTip();
- break;
- case 8:
- additionalOreDictData = Materials.SuperconductorUHV.toString();
- tooltip = Materials.SuperconductorUHV.getToolTip();
- break;
- case 9:
- additionalOreDictData = "Infinite";
- tooltip = "An Infinite Circuit";
- break;
- case 10:
- additionalOreDictData = "Bio";
- tooltip = "A Bio Circuit";
- break;
- }
-
- ItemStack tStack = BW_Meta_Items.NEWCIRCUITS.addCircuit(aID, aName, tooltip, aTier);
-
- GT_OreDictUnificator.registerOre((aOreDictPrefix + additionalOreDictData).replace(" ", ""), tStack);
- }
-
- public static class BW_GT_MetaGenCircuits extends BW_Meta_Items.BW_GT_MetaGen_Item_Hook {
-
- public BW_GT_MetaGenCircuits() {
- super("bwMetaGeneratedItem0");
- }
-
- public final ItemStack addCircuit(int aID, String aEnglish, String aToolTip, int tier) {
- CircuitImprintLoader.bwCircuitTagMap.put(
- new CircuitData(
- BW_Util.getMachineVoltageFromTier(Math.min(1, tier - 2)),
- tier > 2 ? BW_Util.CLEANROOM : 0,
- (byte) tier),
- new ItemStack(BW_Meta_Items.NEWCIRCUITS, 1, aID));
- return this.addItem(aID, aEnglish, aToolTip, SubTag.NO_UNIFICATION);
- }
-
- public final ItemStack getStack(int... meta_amount) {
- ItemStack ret = new ItemStack(this);
- if (meta_amount.length <= 0 || meta_amount.length > 2) return ret;
- if (meta_amount.length == 1) {
- ret.setItemDamage(meta_amount[0]);
- return ret;
- }
- ret.setItemDamage(meta_amount[0]);
- ret.stackSize = meta_amount[1];
- return ret;
- }
-
- public final ItemStack getStackWithNBT(NBTTagCompound tag, int... meta_amount) {
- ItemStack ret = this.getStack(meta_amount);
- ret.setTagCompound(tag);
- return ret;
- }
-
- @Override
- public void getSubItems(Item var1, CreativeTabs aCreativeTab, List<ItemStack> aList) {
- if (aCreativeTab == this.getCreativeTab())
- for (NBTTagCompound tag : CircuitImprintLoader.recipeTagMap.keySet()) {
- ItemStack stack = new ItemStack(BW_Meta_Items.NEWCIRCUITS, 1, 0);
- stack.setTagCompound(tag);
- aList.add(stack);
- }
- super.getSubItems(var1, aCreativeTab, aList);
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public final void registerIcons(IIconRegister aIconRegister) {
-
- for (short i = 0; i < CircuitImprintLoader.reverseIDs; ++i) {
- if (this.mEnabledItems.get(i)) {
- BW_Util.set2DCoordTo1DArray(
- i,
- 0,
- 2,
- aIconRegister.registerIcon(
- "gregtech:" + (GT_Config.troll ? "troll" : this.getUnlocalizedName() + "/" + i)),
- this.mIconList);
- }
- }
-
- for (short i = CircuitImprintLoader.reverseIDs; i < Short.MAX_VALUE; i++) {
- if (this.mEnabledItems.get(i)) {
- BW_Util.set2DCoordTo1DArray(
- i,
- 0,
- 2,
- Objects.requireNonNull(CircuitImprintLoader.circuitIIconRefs.get(i))
- .get(1)
- .getIconIndex(),
- this.mIconList);
- BW_Util.set2DCoordTo1DArray(
- i,
- 1,
- 2,
- aIconRegister.registerIcon(MainMod.MOD_ID + ":WrapOverlay"),
- this.mIconList);
- }
- }
- }
-
- @Override
- protected void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
- if (aStack.getItemDamage() == 0) if (aStack.getTagCompound() != null
- && CircuitImprintLoader.getStackFromTag(aStack.getTagCompound()) != null)
- aList.add(
- "An Imprint for: " + GT_LanguageManager.getTranslation(
- GT_LanguageManager.getTranslateableItemStackName(
- CircuitImprintLoader.getStackFromTag(aStack.getTagCompound()))));
- else aList.add("An Imprint for a Circuit");
- else if (aStack.getItemDamage() == 1) if (aStack.getTagCompound() != null
- && CircuitImprintLoader.getStackFromTag(aStack.getTagCompound()) != null)
- aList.add(
- "A Sliced " + GT_LanguageManager.getTranslation(
- GT_LanguageManager.getTranslateableItemStackName(
- CircuitImprintLoader.getStackFromTag(aStack.getTagCompound()))));
- else aList.add("A Sliced Circuit");
- super.addAdditionalToolTips(aList, aStack, aPlayer);
- }
- }
-
- public static class BW_GT_MetaGen_Item_Hook extends GT_MetaBase_Item {
-
- public static final HashSet<BW_Meta_Items.BW_GT_MetaGen_Item_Hook> sInstances = new HashSet<>();
- public final IIcon[] mIconList;
- public final BitSet mEnabledItems;
-
- {
- this.mIconList = new IIcon[Short.MAX_VALUE * 2];
- this.mEnabledItems = new BitSet(Short.MAX_VALUE);
- }
-
- private BW_GT_MetaGen_Item_Hook(String aUnlocalized) {
- super(aUnlocalized);
-
- this.setCreativeTab(new CreativeTabs("bw.MetaItems.0") {
-
- @Override
- public Item getTabIconItem() {
- return ItemRegistry.TAB;
- }
- });
- this.setHasSubtypes(true);
- this.setMaxDamage(0);
- BW_Meta_Items.BW_GT_MetaGen_Item_Hook.sInstances.add(this);
- }
-
- @Override
- public Long[] getElectricStats(ItemStack itemStack) {
- return null;
- }
-
- @Override
- public Long[] getFluidContainerStats(ItemStack itemStack) {
- return null;
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public final ItemStack addItem(int aID, String aEnglish, String aToolTip, Object... aRandomData) {
- if (aToolTip == null) {
- aToolTip = "";
- }
- ItemStack rStack = new ItemStack(this, 1, aID);
- GT_LanguageManager.addStringLocalization(this.getUnlocalizedName(rStack) + ".name", aEnglish);
- GT_LanguageManager.addStringLocalization(this.getUnlocalizedName(rStack) + ".tooltip", aToolTip);
- List<TC_Aspects.TC_AspectStack> tAspects = new ArrayList<>();
- this.mEnabledItems.set(aID);
- Object[] var7 = aRandomData;
- int var8 = aRandomData.length;
-
- int var9;
- Object tRandomData;
- for (var9 = 0; var9 < var8; ++var9) {
- tRandomData = var7[var9];
- if (tRandomData instanceof SubTag && tRandomData == SubTag.NO_UNIFICATION) {
- GT_OreDictUnificator.addToBlacklist(rStack);
- }
- }
-
- var7 = aRandomData;
- var8 = aRandomData.length;
-
- for (var9 = 0; var9 < var8; ++var9) {
- tRandomData = var7[var9];
- if (tRandomData != null) {
- boolean tUseOreDict = true;
-
- if (tRandomData instanceof IItemBehaviour) {
- this.addItemBehavior(aID, (IItemBehaviour) tRandomData);
- tUseOreDict = false;
- }
-
- if (tRandomData instanceof IItemContainer) {
- ((IItemContainer) tRandomData).set(rStack);
- tUseOreDict = false;
- }
-
- if (!(tRandomData instanceof SubTag)) {
- 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 void getSubItems(Item var1, CreativeTabs aCreativeTab, List<ItemStack> aList) {
- int j = this.mEnabledItems.length();
-
- for (int i = 0; i < j; ++i) {
- if (this.mEnabledItems.get(i)) {
- ItemStack tStack = new ItemStack(this, 1, i);
- this.isItemStackUsable(tStack);
- aList.add(tStack);
- }
- }
- }
-
- @Override
- protected void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
- super.addAdditionalToolTips(aList, aStack, aPlayer);
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public String getUnlocalizedName(ItemStack aStack) {
- return this.getUnlocalizedName() + "." + aStack.getItemDamage();
- }
-
- @Override
- public IIcon getIconFromDamage(int i) {
- if (this.mEnabledItems.get(i)) return (IIcon) BW_Util.get2DCoordFrom1DArray(i, 0, 2, this.mIconList);
- return null;
- }
-
- @Override
- public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem,
- int useRemaining) {
- return this.getIconFromDamage(stack.getItemDamage());
- }
-
- @Override
- public IIcon getIcon(ItemStack stack, int pass) {
- return this.getIconFromDamage(stack.getItemDamage());
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java
deleted file mode 100644
index 874ae202f1..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration;
-
-import java.nio.ByteBuffer;
-
-import com.github.bartimaeusnek.bartworks.util.MurmurHash3;
-
-public class CircuitData {
-
- private long aVoltage;
- private int aSpecial;
- private byte aTier;
-
- public CircuitData(long aVoltage, int aSpecial, byte aTier) {
- this.aVoltage = aVoltage;
- this.aSpecial = aSpecial;
- this.aTier = aTier;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof CircuitData that)) return false;
- if (this.getaVoltage() != that.getaVoltage() || this.getaSpecial() != that.getaSpecial()) return false;
- return this.getaTier() == that.getaTier();
- }
-
- @Override
- public int hashCode() {
- return MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(13)
- .put(this.aTier)
- .putInt(this.aSpecial)
- .putLong(this.aVoltage)
- .array(),
- 0,
- 13,
- 31);
- }
-
- public long getaVoltage() {
- return this.aVoltage;
- }
-
- public void setaVoltage(long aVoltage) {
- this.aVoltage = aVoltage;
- }
-
- public int getaSpecial() {
- return this.aSpecial;
- }
-
- public void setaSpecial(int aSpecial) {
- this.aSpecial = aSpecial;
- }
-
- public byte getaTier() {
- return this.aTier;
- }
-
- public void setaTier(byte aTier) {
- this.aTier = aTier;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java
deleted file mode 100644
index 5d3886b9e9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.CraftingManager;
-import net.minecraft.item.crafting.IRecipe;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.oredict.OreDictionary;
-import net.minecraftforge.oredict.ShapedOreRecipe;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BWNBTDependantCraftingRecipe;
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.ASM.BWCoreStaticReplacementMethodes;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
-
-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.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;
-
-public class CircuitImprintLoader {
-
- public static short reverseIDs = Short.MAX_VALUE - 1;
-
- public static final ArrayListMultimap<NBTTagCompound, GT_Recipe> recipeTagMap = ArrayListMultimap.create();
- public static final HashBiMap<Short, ItemList> circuitIIconRefs = HashBiMap.create(20);
- public static final HashSet<ItemStack> blacklistSet = new HashSet<>();
- static final HashBiMap<CircuitData, ItemStack> bwCircuitTagMap = HashBiMap.create(20);
- private static final HashSet<IRecipe> recipeWorldCache = new HashSet<>();
- private static final HashSet<GT_Recipe> gtrecipeWorldCache = new HashSet<>();
- private static final HashSet<GT_Recipe> ORIGINAL_CAL_RECIPES = new HashSet<>();
- private static final HashSet<GT_Recipe> MODIFIED_CAL_RECIPES = new HashSet<>();
-
- public static void run() {
- HashSet<GT_Recipe> toRem = new HashSet<>();
- HashSet<GT_Recipe> toAdd = new HashSet<>();
-
- deleteCALRecipesAndTags();
- rebuildCircuitAssemblerMap(toRem, toAdd);
- exchangeRecipesInList(toRem, toAdd);
- makeCircuitImprintRecipes();
-
- toRem = null;
- toAdd = null;
- }
-
- private static void reAddOriginalRecipes() {
- RecipeMaps.circuitAssemblerRecipes.getBackend()
- .removeRecipes(MODIFIED_CAL_RECIPES);
- ORIGINAL_CAL_RECIPES.forEach(RecipeMaps.circuitAssemblerRecipes::add);
- ORIGINAL_CAL_RECIPES.clear();
- MODIFIED_CAL_RECIPES.clear();
- }
-
- private static void rebuildCircuitAssemblerMap(HashSet<GT_Recipe> toRem, HashSet<GT_Recipe> toAdd) {
- reAddOriginalRecipes();
- RecipeMaps.circuitAssemblerRecipes.getAllRecipes()
- .forEach(e -> CircuitImprintLoader.handleCircuitRecipeRebuilding(e, toRem, toAdd));
- }
-
- private static void handleCircuitRecipeRebuilding(GT_Recipe circuitRecipe, HashSet<GT_Recipe> toRem,
- HashSet<GT_Recipe> toAdd) {
- ItemStack[] outputs = circuitRecipe.mOutputs;
- boolean isOrePass = isCircuitOreDict(outputs[0]);
- String unlocalizedName = outputs[0].getUnlocalizedName();
- if (isOrePass || unlocalizedName.contains("Circuit") || unlocalizedName.contains("circuit")) {
-
- CircuitImprintLoader.recipeTagMap
- .put(CircuitImprintLoader.getTagFromStack(outputs[0]), circuitRecipe.copy());
-
- Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
- ? FluidRegistry.getFluid("molten.indalloy140")
- : FluidRegistry.getFluid("molten.solderingalloy");
-
- Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
- ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
- : FluidRegistry.getFluid("molten.solderingalloy");
-
- if (circuitRecipe.mFluidInputs[0].isFluidEqual(Materials.SolderingAlloy.getMolten(0))
- || circuitRecipe.mFluidInputs[0].isFluidEqual(new FluidStack(solderIndalloy, 0))
- || circuitRecipe.mFluidInputs[0].isFluidEqual(new FluidStack(solderUEV, 0))) {
- GT_Recipe newRecipe = CircuitImprintLoader.reBuildRecipe(circuitRecipe);
- if (newRecipe != null) BartWorksRecipeMaps.circuitAssemblyLineRecipes.addRecipe(newRecipe);
- addCutoffRecipeToSets(toRem, toAdd, circuitRecipe);
- } else if (circuitRecipe.mEUt > BW_Util.getTierVoltage(ConfigHandler.cutoffTier)) toRem.add(circuitRecipe);
- }
- }
-
- private static boolean isCircuitOreDict(ItemStack item) {
- return BW_Util.isTieredCircuit(item) || BW_Util.getOreNames(item)
- .stream()
- .anyMatch(s -> "circuitPrimitiveArray".equals(s));
- }
-
- private static void exchangeRecipesInList(HashSet<GT_Recipe> toRem, HashSet<GT_Recipe> toAdd) {
- toAdd.forEach(RecipeMaps.circuitAssemblerRecipes::add);
- RecipeMaps.circuitAssemblerRecipes.getBackend()
- .removeRecipes(toRem);
- ORIGINAL_CAL_RECIPES.addAll(toRem);
- MODIFIED_CAL_RECIPES.addAll(toAdd);
- }
-
- private static void addCutoffRecipeToSets(HashSet<GT_Recipe> toRem, HashSet<GT_Recipe> toAdd,
- GT_Recipe circuitRecipe) {
- if (circuitRecipe.mEUt > BW_Util.getTierVoltage(ConfigHandler.cutoffTier)) {
- toRem.add(circuitRecipe);
- toAdd.add(CircuitImprintLoader.makeMoreExpensive(circuitRecipe));
- }
- }
-
- @SuppressWarnings("deprecation")
- public static GT_Recipe makeMoreExpensive(GT_Recipe original) {
- GT_Recipe newRecipe = original.copy();
- for (ItemStack is : newRecipe.mInputs) {
- if (!BW_Util.isTieredCircuit(is)) {
- is.stackSize = Math.min(is.stackSize * 6, 64);
- if (is.stackSize > is.getItem()
- .getItemStackLimit() || is.stackSize > is.getMaxStackSize()) is.stackSize = is.getMaxStackSize();
- }
- }
- newRecipe.mFluidInputs[0].amount *= 4;
- newRecipe.mDuration *= 4;
- return newRecipe;
- }
-
- public static GT_Recipe reBuildRecipe(GT_Recipe original) {
- ItemStack[] in = new ItemStack[6];
- BiMap<ItemList, Short> inversed = CircuitImprintLoader.circuitIIconRefs.inverse();
-
- for (int i = 0; i < 6; i++) {
- try {
- replaceCircuits(inversed, original, in, i);
- replaceComponents(in, original, i);
- } catch (ArrayIndexOutOfBoundsException e) {
- break;
- } catch (NullPointerException e) {
- e.printStackTrace();
- }
- }
-
- if (CircuitImprintLoader.checkForBlacklistedComponents(in)) {
- return null;
- }
-
- return new GT_Recipe(
- false,
- in,
- new ItemStack[] { getOutputMultiplied(original) },
- BW_Meta_Items.getNEWCIRCUITS()
- .getStackWithNBT(CircuitImprintLoader.getTagFromStack(original.mOutputs[0]), 0, 0),
- null,
- original.mFluidInputs,
- null,
- original.mDuration * 12,
- original.mEUt,
- 0);
- }
-
- private static ItemStack getOutputMultiplied(GT_Recipe original) {
- ItemStack out = original.copy()
- .getOutput(0);
- out.stackSize *= 16;
- return out;
- }
-
- private static void replaceCircuits(BiMap<ItemList, Short> inversed, GT_Recipe original, ItemStack[] in,
- int index) {
- for (ItemList il : inversed.keySet()) {
- if (GT_Utility.areStacksEqual(il.get(1), replaceCircuitParts(original.mInputs[index]))) {
- in[index] = BW_Meta_Items.getNEWCIRCUITS()
- .getStack(inversed.get(il), original.mInputs[index].stackSize);
- }
- }
- }
-
- private static final List<Pair<ItemStack, ItemStack>> circuitPartsToReplace = Collections.unmodifiableList(
- Arrays.asList(
- new Pair<>(ItemList.Circuit_Parts_Resistor.get(1), ItemList.Circuit_Parts_ResistorSMD.get(1)),
- new Pair<>(ItemList.Circuit_Parts_Diode.get(1), ItemList.Circuit_Parts_DiodeSMD.get(1)),
- new Pair<>(ItemList.Circuit_Parts_Transistor.get(1), ItemList.Circuit_Parts_TransistorSMD.get(1)),
- new Pair<>(ItemList.Circuit_Parts_Capacitor.get(1), ItemList.Circuit_Parts_CapacitorSMD.get(1)),
- new Pair<>(ItemList.Circuit_Parts_Coil.get(1), ItemList.Circuit_Parts_InductorSMD.get(1))));
-
- private static ItemStack replaceCircuitParts(ItemStack stack) {
- for (Pair<ItemStack, ItemStack> pair : circuitPartsToReplace) {
- if (GT_Utility.areStacksEqual(pair.getKey(), stack)) {
- ItemStack newStack = pair.getValue();
- newStack.stackSize = stack.stackSize;
- return newStack;
- }
- }
- return stack;
- }
-
- @SuppressWarnings("deprecation")
- private static void replaceComponents(ItemStack[] in, GT_Recipe original, int index)
- throws ArrayIndexOutOfBoundsException {
- if (original.mInputs[index] != null && in[index] == null) {
- // big wires
- if (BW_Util.checkStackAndPrefix(original.mInputs[index])
- && GT_OreDictUnificator.getAssociation(original.mInputs[index]).mPrefix == OrePrefixes.wireGt01) {
- in[index] = GT_OreDictUnificator.get(
- OrePrefixes.wireGt16,
- GT_OreDictUnificator.getAssociation(original.mInputs[index]).mMaterial.mMaterial,
- original.mInputs[index].stackSize);
- // fine wires
- } else if (BW_Util.checkStackAndPrefix(original.mInputs[index])
- && GT_OreDictUnificator.getAssociation(original.mInputs[index]).mPrefix == OrePrefixes.wireFine) {
- in[index] = GT_OreDictUnificator.get(
- OrePrefixes.wireGt04,
- GT_OreDictUnificator.getAssociation(original.mInputs[index]).mMaterial.mMaterial,
- original.mInputs[index].stackSize);
- if (in[index] == null) {
- in[index] = GT_OreDictUnificator.get(
- OrePrefixes.wireFine,
- GT_OreDictUnificator.getAssociation(original.mInputs[index]).mMaterial.mMaterial,
- original.mInputs[index].stackSize * 16);
- }
- // other components
- } else {
- in[index] = original.mInputs[index].copy();
- in[index].stackSize *= 16;
- if (in[index].stackSize > in[index].getItem()
- .getItemStackLimit() || in[index].stackSize > in[index].getMaxStackSize())
- in[index].stackSize = in[index].getMaxStackSize();
- }
- }
- }
-
- private static void makeCircuitImprintRecipes() {
- removeOldRecipesFromRegistries();
- CircuitImprintLoader.recipeTagMap.keySet()
- .forEach(e -> {
- makeAndAddSlicingRecipe(e);
- makeAndAddCraftingRecipes(e);
- });
- }
-
- private static boolean checkForBlacklistedComponents(ItemStack[] itemStacks) {
- for (ItemStack is : itemStacks) {
- for (ItemStack is2 : CircuitImprintLoader.blacklistSet) {
- if (GT_Utility.areStacksEqual(is, is2)) return true;
- }
- }
- return false;
- }
-
- private static void removeOldRecipesFromRegistries() {
- recipeWorldCache.forEach(
- CraftingManager.getInstance()
- .getRecipeList()::remove);
- BWCoreStaticReplacementMethodes.clearRecentlyUsedRecipes();
- RecipeMaps.slicerRecipes.getBackend()
- .removeRecipes(gtrecipeWorldCache);
- recipeWorldCache.forEach(r -> {
- try {
- BW_Util.getGTBufferedRecipeList()
- .remove(r);
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- recipeWorldCache.clear();
- gtrecipeWorldCache.clear();
- }
-
- private static void makeAndAddSlicingRecipe(NBTTagCompound tag) {
- ItemStack stack = CircuitImprintLoader.getStackFromTag(tag);
- int eut = Integer.MAX_VALUE;
-
- for (GT_Recipe recipe : CircuitImprintLoader.recipeTagMap.get(tag)) {
- eut = Math.min(eut, recipe.mEUt);
- }
-
- eut = Math.min(
- eut,
- BW_Util.getMachineVoltageFromTier(
- BW_Util.getCircuitTierFromOreDictName(
- OreDictionary.getOreName(
- OreDictionary.getOreIDs(stack) != null && OreDictionary.getOreIDs(stack).length > 0
- ? OreDictionary.getOreIDs(stack)[0]
- : -1))));
- GT_Recipe slicingRecipe = new GT_Recipe(
- true,
- new ItemStack[] { stack, ItemList.Shape_Slicer_Flat.get(0) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStackWithNBT(tag, 1, 1) },
- null,
- null,
- null,
- null,
- 300,
- eut,
- BW_Util.CLEANROOM);
- gtrecipeWorldCache.add(slicingRecipe);
- RecipeMaps.slicerRecipes.add(slicingRecipe);
- }
-
- private static void makeAndAddCraftingRecipes(NBTTagCompound tag) {
- ItemStack circuit = BW_Meta_Items.getNEWCIRCUITS()
- .getStackWithNBT(tag, 0, 1);
- Object[] imprintRecipe = { " X ", "GPG", " X ", 'P', BW_Meta_Items.getNEWCIRCUITS()
- .getStackWithNBT(tag, 1, 1), 'G', WerkstoffLoader.Prasiolite.get(OrePrefixes.gemExquisite, 1), 'X',
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3) };
-
- IRecipe bwrecipe = new BWNBTDependantCraftingRecipe(circuit, imprintRecipe);
- ShapedOreRecipe gtrecipe = BW_Util.createGTCraftingRecipe(
- circuit,
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.KEEPNBT
- | GT_ModHandler.RecipeBits.BUFFERED,
- imprintRecipe);
-
- // Adds the actual recipe
- recipeWorldCache.add(bwrecipe);
- GameRegistry.addRecipe(bwrecipe);
- // Adds the NEI visual recipe
- recipeWorldCache.add(gtrecipe);
- GameRegistry.addRecipe(gtrecipe);
- }
-
- public static NBTTagCompound getTagFromStack(ItemStack stack) {
- if (GT_Utility.isStackValid(stack)) return BW_Util.setStackSize(stack.copy(), 1)
- .writeToNBT(new NBTTagCompound());
- return new NBTTagCompound();
- }
-
- public static ItemStack getStackFromTag(NBTTagCompound tagCompound) {
- return ItemStack.loadItemStackFromNBT(tagCompound);
- }
-
- private static void deleteCALRecipesAndTags() {
- BartWorksRecipeMaps.circuitAssemblyLineRecipes.getBackend()
- .clearRecipes();
- recipeTagMap.clear();
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java
deleted file mode 100644
index 6db9c63134..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration;
-
-import static gregtech.api.enums.ItemList.Circuit_Board_Advanced;
-import static gregtech.api.enums.ItemList.Circuit_Board_Basic;
-import static gregtech.api.enums.ItemList.Circuit_Board_Bio;
-import static gregtech.api.enums.ItemList.Circuit_Board_Bio_Ultra;
-import static gregtech.api.enums.ItemList.Circuit_Board_Coated;
-import static gregtech.api.enums.ItemList.Circuit_Board_Coated_Basic;
-import static gregtech.api.enums.ItemList.Circuit_Board_Elite;
-import static gregtech.api.enums.ItemList.Circuit_Board_Epoxy;
-import static gregtech.api.enums.ItemList.Circuit_Board_Epoxy_Advanced;
-import static gregtech.api.enums.ItemList.Circuit_Board_Fiberglass;
-import static gregtech.api.enums.ItemList.Circuit_Board_Fiberglass_Advanced;
-import static gregtech.api.enums.ItemList.Circuit_Board_Multifiberglass;
-import static gregtech.api.enums.ItemList.Circuit_Board_Multifiberglass_Elite;
-import static gregtech.api.enums.ItemList.Circuit_Board_Optical;
-import static gregtech.api.enums.ItemList.Circuit_Board_Phenolic;
-import static gregtech.api.enums.ItemList.Circuit_Board_Phenolic_Good;
-import static gregtech.api.enums.ItemList.Circuit_Board_Plastic;
-import static gregtech.api.enums.ItemList.Circuit_Board_Plastic_Advanced;
-import static gregtech.api.enums.ItemList.Circuit_Board_Wetware;
-import static gregtech.api.enums.ItemList.Circuit_Board_Wetware_Extreme;
-import static gregtech.api.enums.ItemList.Circuit_Chip_BioCPU;
-import static gregtech.api.enums.ItemList.Circuit_Chip_Biocell;
-import static gregtech.api.enums.ItemList.Circuit_Chip_CPU;
-import static gregtech.api.enums.ItemList.Circuit_Chip_CrystalCPU;
-import static gregtech.api.enums.ItemList.Circuit_Chip_CrystalSoC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_CrystalSoC2;
-import static gregtech.api.enums.ItemList.Circuit_Chip_HPIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_ILC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_LPIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_NAND;
-import static gregtech.api.enums.ItemList.Circuit_Chip_NOR;
-import static gregtech.api.enums.ItemList.Circuit_Chip_NPIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_NanoCPU;
-import static gregtech.api.enums.ItemList.Circuit_Chip_NeuroCPU;
-import static gregtech.api.enums.ItemList.Circuit_Chip_Optical;
-import static gregtech.api.enums.ItemList.Circuit_Chip_PIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_PPIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_QPIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_QuantumCPU;
-import static gregtech.api.enums.ItemList.Circuit_Chip_Ram;
-import static gregtech.api.enums.ItemList.Circuit_Chip_Simple_SoC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_SoC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_SoC2;
-import static gregtech.api.enums.ItemList.Circuit_Chip_Stemcell;
-import static gregtech.api.enums.ItemList.Circuit_Chip_UHPIC;
-import static gregtech.api.enums.ItemList.Circuit_Chip_ULPIC;
-import static gregtech.api.enums.ItemList.Circuit_Integrated;
-import static gregtech.api.enums.ItemList.Circuit_Integrated_Good;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Advanced;
-import static gregtech.api.enums.ItemList.Circuit_Parts_CapacitorASMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_CapacitorSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_CapacitorXSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Chip_Bioware;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Crystal_Chip_Elite;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Crystal_Chip_Master;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Crystal_Chip_Wetware;
-import static gregtech.api.enums.ItemList.Circuit_Parts_DiodeASMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_DiodeSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_DiodeXSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_GlassFiber;
-import static gregtech.api.enums.ItemList.Circuit_Parts_InductorASMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_InductorSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_InductorXSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_PetriDish;
-import static gregtech.api.enums.ItemList.Circuit_Parts_ResistorASMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_ResistorSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_ResistorXSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_TransistorASMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_TransistorSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_TransistorXSMD;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Vacuum_Tube;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Wiring_Advanced;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Wiring_Basic;
-import static gregtech.api.enums.ItemList.Circuit_Parts_Wiring_Elite;
-import static gregtech.api.enums.ItemList.Optical_Cpu_Containment_Housing;
-import static gregtech.api.enums.ItemList.Optically_Compatible_Memory;
-import static gregtech.api.enums.ItemList.Optically_Perfected_CPU;
-import static gregtech.api.enums.ItemList.values;
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.client.renderer.BW_GT_ItemRenderer;
-
-import cpw.mods.fml.common.FMLCommonHandler;
-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_LanguageManager;
-import gregtech.api.util.GT_Utility;
-
-public class CircuitPartLoader implements Runnable {
-
- @Override
- public void run() {
- CircuitPartLoader.makeCircuitParts();
- if (FMLCommonHandler.instance()
- .getEffectiveSide()
- .isClient()) new BW_GT_ItemRenderer();
- }
-
- public static void makeCircuitParts() {
- ItemList[] itemLists = values();
- for (ItemList single : itemLists) {
- if (!single.hasBeenSet()) continue;
- if (single.toString()
- .contains("Wafer")
- || single.toString()
- .contains("Circuit_Silicon_Ingot")
- || single.toString()
- .contains("Raw")
- || single.toString()
- .contains("raw")
- || single.toString()
- .contains("Glass_Tube")
- || single == Circuit_Parts_GlassFiber
- || single == Circuit_Parts_Advanced
- || single == Circuit_Parts_Wiring_Advanced
- || single == Circuit_Parts_Wiring_Elite
- || single == Circuit_Parts_Wiring_Basic
- || single == Circuit_Integrated
- || single == Circuit_Parts_PetriDish
- || single == Circuit_Parts_Vacuum_Tube
- || single == Circuit_Integrated_Good) {
-
- CircuitImprintLoader.blacklistSet.add(single.get(1));
- }
- }
-
- for (ItemList single : CIRCUIT_PARTS) {
- if (!single.hasBeenSet()) continue;
- ItemStack itemStack = single.get(1);
- if (!GT_Utility.isStackValid(itemStack)) continue;
- ArrayList<String> toolTip = new ArrayList<>();
- if (FMLCommonHandler.instance()
- .getEffectiveSide()
- .isClient())
- single.getItem()
- .addInformation(
- single.get(1)
- .copy(),
- null,
- toolTip,
- true);
- String tt = toolTip.size() > 0 ? toolTip.get(0) : "";
- // tt += "Internal Name = "+single;
- String localised = GT_LanguageManager
- .getTranslation(GT_LanguageManager.getTranslateableItemStackName(itemStack));
- BW_Meta_Items.getNEWCIRCUITS()
- .addItem(CircuitImprintLoader.reverseIDs, "Wrap of " + localised + "s", tt);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- single.get(16)
- .copy(),
- GT_Utility.getIntegratedCircuit(16))
- .itemOutputs(
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(CircuitImprintLoader.reverseIDs))
- .fluidInputs(Materials.Plastic.getMolten(72))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(assemblerRecipes);
-
- CircuitImprintLoader.circuitIIconRefs.put(CircuitImprintLoader.reverseIDs, single);
- CircuitImprintLoader.reverseIDs--;
- }
- }
-
- /**
- * Contains all the circuit parts we want to generate wrapped version of. New entries MUST be placed at the END of
- * this list, to prevent id shift.
- */
- private static final List<ItemList> CIRCUIT_PARTS = Collections.unmodifiableList(
- Arrays.asList(
- Circuit_Board_Basic,
- Circuit_Board_Advanced,
- Circuit_Board_Elite,
- Circuit_Parts_Crystal_Chip_Elite,
- Circuit_Parts_Crystal_Chip_Master,
- 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_Parts_ResistorSMD,
- Circuit_Parts_InductorSMD,
- Circuit_Parts_DiodeSMD,
- Circuit_Parts_TransistorSMD,
- Circuit_Parts_CapacitorSMD,
- Circuit_Parts_ResistorASMD,
- Circuit_Parts_DiodeASMD,
- Circuit_Parts_TransistorASMD,
- Circuit_Parts_CapacitorASMD,
- Circuit_Chip_ILC,
- Circuit_Chip_Ram,
- Circuit_Chip_NAND,
- Circuit_Chip_NOR,
- Circuit_Chip_CPU,
- Circuit_Chip_SoC,
- Circuit_Chip_SoC2,
- Circuit_Chip_PIC,
- Circuit_Chip_Simple_SoC,
- Circuit_Chip_HPIC,
- Circuit_Chip_UHPIC,
- Circuit_Chip_ULPIC,
- Circuit_Chip_LPIC,
- Circuit_Chip_NPIC,
- Circuit_Chip_PPIC,
- Circuit_Chip_QPIC,
- Circuit_Chip_NanoCPU,
- Circuit_Chip_QuantumCPU,
- Circuit_Chip_CrystalCPU,
- Circuit_Chip_CrystalSoC,
- Circuit_Chip_CrystalSoC2,
- Circuit_Chip_NeuroCPU,
- Circuit_Chip_BioCPU,
- Circuit_Chip_Stemcell,
- Circuit_Chip_Biocell,
- Circuit_Parts_ResistorXSMD,
- Circuit_Parts_DiodeXSMD,
- Circuit_Parts_TransistorXSMD,
- Circuit_Parts_CapacitorXSMD,
- Circuit_Parts_InductorASMD,
- Circuit_Parts_InductorXSMD,
- Circuit_Chip_Optical,
- Circuit_Board_Optical,
- Optically_Perfected_CPU,
- Optical_Cpu_Containment_Housing,
- Optically_Compatible_Memory,
- Circuit_Parts_Crystal_Chip_Wetware,
- Circuit_Parts_Chip_Bioware));
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java
deleted file mode 100644
index 91dc709609..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.GT_Enhancement;
-
-import static com.github.bartimaeusnek.bartworks.system.material.GT_Enhancement.GTMetaItemEnhancer.NoMetaValue;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.item.EntityItem;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.IIcon;
-import net.minecraft.world.World;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Items;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.enums.Textures;
-import gregtech.api.interfaces.IIconContainer;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.common.render.items.GT_GeneratedMaterial_Renderer;
-
-public class BWGTMetaItems extends BW_MetaGenerated_Items {
-
- private boolean hasList;
- private final Set<Integer> hiddenThings = new HashSet<>();
-
- public BWGTMetaItems(OrePrefixes orePrefixes, List<Materials> noSubIDMaterials) {
- super(orePrefixes, null);
- // materialloop:
- for (int i = 0; i < Materials.values().length; i++) {
- ItemStack tStack = new ItemStack(this, 1, i);
- Materials material = Materials.values()[i];
- if (material.getMolten(1) == null && orePrefixes == OrePrefixes.capsuleMolten
- || material.getFluid(1) == null && material.getGas(1) == null
- && (orePrefixes == OrePrefixes.capsule || orePrefixes == OrePrefixes.bottle))
- continue;
-
- if (OreDictionary.doesOreNameExist(this.orePrefixes.name() + material.mDefaultLocalName.replace(" ", ""))) {
- this.hiddenThings.add(i);
- continue;
- }
- GT_OreDictUnificator
- .registerOre(this.orePrefixes.name() + material.mDefaultLocalName.replace(" ", ""), tStack);
- }
-
- if (noSubIDMaterials != null) {
- this.hasList = true;
- // materialloop:
- for (int i = 0; i < noSubIDMaterials.size(); i++) {
- ItemStack tStack = new ItemStack(this, 1, i + 1001);
- Materials w = noSubIDMaterials.get(i);
- if (w.getMolten(1) == null && orePrefixes == OrePrefixes.capsuleMolten
- || w.getFluid(1) == null && w.getGas(1) == null
- && (orePrefixes == OrePrefixes.capsule || orePrefixes == OrePrefixes.bottle))
- continue;
-
- if (OreDictionary.doesOreNameExist(this.orePrefixes.name() + w.mDefaultLocalName.replace(" ", ""))) {
- this.hiddenThings.add(i);
- continue;
- }
- GT_OreDictUnificator
- .registerOre(this.orePrefixes.name() + w.mDefaultLocalName.replace(" ", ""), tStack);
- }
- }
- }
-
- private Materials getMaterial(ItemStack is) {
- if (is == null || is.getItem() != this) return null;
- final int meta = is.getItemDamage();
- return this.getMaterialFromMeta(meta);
- }
-
- @Override
- public String getItemStackDisplayName(ItemStack aStack) {
- Materials material = this.getMaterial(aStack);
- if (material == null) material = Materials._NULL;
- return material.getLocalizedNameForItem(this.itemTypeLocalizedName);
- }
-
- @Override
- protected void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
- Materials material = this.getMaterial(aStack);
- if (material != null) {
- String tooltip = material.getToolTip();
- if (tooltip != null && !tooltip.isEmpty()) {
- aList.add(tooltip);
- }
- }
- aList.add(BW_Tooltip_Reference.ADDED_BY_BARTWORKS.get());
- }
-
- @Override
- public IIconContainer getIconContainer(int aMetaData) {
- if (this.orePrefixes.mTextureIndex == -1) return this.getIconContainerBartWorks(aMetaData);
- Materials material = this.getMaterialFromMeta(aMetaData);
- if (material != null) {
- return material.mIconSet.mTextures[this.orePrefixes.mTextureIndex];
- }
- return null;
- }
-
- @Override
- protected IIconContainer getIconContainerBartWorks(int aMetaData) {
- if (SideReference.Side.Server || PrefixTextureLinker.texMap == null) return null;
-
- HashMap<TextureSet, Textures.ItemIcons.CustomIcon> iconLink = PrefixTextureLinker.texMap.get(this.orePrefixes);
-
- if (iconLink == null) return null;
-
- Materials material = this.getMaterialFromMeta(aMetaData);
-
- if (material == null || material.mIconSet == null) return null;
-
- return iconLink.getOrDefault(material.mIconSet, iconLink.get(TextureSet.SET_DULL));
- }
-
- @Override
- public IIcon getIconFromDamage(int aMetaData) {
- return this.getIcon(aMetaData, 0);
- }
-
- @Override
- public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) {
- return this.getMaterialFromMeta(aMetaData).renderer;
- }
-
- public Materials getMaterialFromMeta(int aMetaData) {
- if (aMetaData > 1000 && this.hasList) {
- return NoMetaValue.get(aMetaData - 1001);
- }
- if (aMetaData < 0 || aMetaData >= Materials.values().length) {
- return null;
- }
- return Materials.values()[aMetaData];
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public void getSubItems(Item var1, CreativeTabs aCreativeTab, List<ItemStack> aList) {
- for (int i = 0; i < Materials.values().length; i++) {
- Materials w = Materials.values()[i];
- if (w == null || (w.mTypes & Werkstoff.GenerationFeatures.getPrefixDataRaw(this.orePrefixes)) == 0
- && Werkstoff.GenerationFeatures.getPrefixDataRaw(this.orePrefixes) != 0) continue;
- if (w.getMolten(1) == null && this.orePrefixes == OrePrefixes.capsuleMolten
- || w.getFluid(1) == null && w.getGas(1) == null
- && (this.orePrefixes == OrePrefixes.capsule || this.orePrefixes == OrePrefixes.bottle))
- continue;
- else if (this.hiddenThings.contains(i)) continue;
- aList.add(new ItemStack(this, 1, i));
- }
- if (this.hasList) for (int i = 0; i < NoMetaValue.size(); i++) {
- Materials w = NoMetaValue.get(i);
- if (w == null || (w.mTypes & Werkstoff.GenerationFeatures.getPrefixDataRaw(this.orePrefixes)) == 0
- && Werkstoff.GenerationFeatures.getPrefixDataRaw(this.orePrefixes) != 0) continue;
- if (w.getMolten(1) == null && this.orePrefixes == OrePrefixes.capsuleMolten
- || w.getFluid(1) == null && w.getGas(1) == null
- && (this.orePrefixes == OrePrefixes.capsule || this.orePrefixes == OrePrefixes.bottle))
- continue;
- else if (this.hiddenThings.contains(i)) continue;
- aList.add(new ItemStack(this, 1, i + 1001));
- }
- }
-
- @Override
- public short[] getColorForGUI(ItemStack aStack) {
- return this.getMaterial(aStack).mRGBa;
- }
-
- @Override
- public String getNameForGUI(ItemStack aStack) {
- return this.getMaterial(aStack).mDefaultLocalName;
- }
-
- @Override
- public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) {}
-
- @Override
- public short[] getRGBa(ItemStack aStack) {
- return this.getMaterial(aStack).mRGBa;
- }
-
- @Override
- public boolean onEntityItemUpdate(EntityItem aItemEntity) {
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java
deleted file mode 100644
index 5b475dc069..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.GT_Enhancement;
-
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidContainerRegistry;
-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.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-
-public class GTMetaItemEnhancer {
-
- static List<Materials> NoMetaValue;
-
- private GTMetaItemEnhancer() {}
-
- public static void init() {
- if (!Forestry.isModLoaded()) {
- return;
- }
- NoMetaValue = Materials.getMaterialsMap()
- .values()
- .stream()
- .filter(m -> m.mMetaItemSubID == -1)
- .collect(Collectors.toList());
- Item moltenCapsuls = new BWGTMetaItems(OrePrefixes.capsuleMolten, null);
- Item capsuls = new BWGTMetaItems(OrePrefixes.capsule, NoMetaValue);
- // Item bottles = new BWGTMetaItems(OrePrefixes.bottle, NoMetaValue);
-
- Materials[] values = Materials.values();
- for (int i = 0, valuesLength = values.length; i < valuesLength; i++) {
- Materials m = values[i];
- if (m.mStandardMoltenFluid != null && GT_OreDictUnificator.get(OrePrefixes.cellMolten, m, 1) != null) {
- final FluidContainerRegistry.FluidContainerData emptyData = new FluidContainerRegistry.FluidContainerData(
- m.getMolten(144),
- new ItemStack(moltenCapsuls, 1, i),
- GT_ModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1));
- FluidContainerRegistry.registerFluidContainer(emptyData);
- GT_Utility.addFluidContainerData(emptyData);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_ModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1))
- .itemOutputs(new ItemStack(moltenCapsuls, 1, i))
- .fluidInputs(m.getMolten(144))
- .duration(2 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(moltenCapsuls, 1, i))
- .fluidOutputs(m.getMolten(144))
- .duration(2 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- }
- if (m.getFluid(1) == null && m.getGas(1) == null || OreDictionary.doesOreNameExist("capsule" + m.mName))
- continue;
- addFluidData(m, GT_ModHandler.getModItem(Forestry.ID, "waxCapsule", 1), capsuls, 1000, i, true);
- // addFluidData(m, new ItemStack(Items.glass_bottle), bottles, 250, i, false);
- }
- for (int i = 0, valuesLength = NoMetaValue.size(); i < valuesLength; i++) {
- Materials m = NoMetaValue.get(i);
- if (m.getFluid(1) == null && m.getGas(1) == null || OreDictionary.doesOreNameExist("capsule" + m.mName))
- continue;
- addFluidData(m, GT_ModHandler.getModItem(Forestry.ID, "waxCapsule", 1), capsuls, 1000, i + 1001, true);
- // addFluidData(m, new ItemStack(Items.glass_bottle), bottles, 250, i + 1001, false);
- }
- }
-
- private static void addFluidData(Materials m, ItemStack container, Item filled, int amount, int it, boolean empty) {
- Fluid f = m.getFluid(1) != null ? m.getFluid(1)
- .getFluid()
- : m.getGas(1)
- .getFluid();
- final FluidContainerRegistry.FluidContainerData emptyData = new FluidContainerRegistry.FluidContainerData(
- new FluidStack(f, amount),
- new ItemStack(filled, 1, it),
- container);
- FluidContainerRegistry.registerFluidContainer(emptyData);
- GT_Utility.addFluidContainerData(emptyData);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(container)
- .itemOutputs(new ItemStack(filled, 1, it))
- .fluidInputs(new FluidStack(f, amount))
- .duration(amount / 62)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(new ItemStack(filled, 1, it))
- .fluidOutputs(new FluidStack(f, amount))
- .duration(amount / 62)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- }
-
- public static void addAdditionalOreDictToForestry() {
- if (!Forestry.isModLoaded()) return;
- OreDictionary.registerOre("capsuleWater", getForestryItem("waxCapsuleWater"));
- OreDictionary.registerOre("capsuleIce", getForestryItem("waxCapsuleIce"));
- OreDictionary.registerOre("capsuleHoney", getForestryItem("waxCapsuleHoney"));
- OreDictionary.registerOre("capsuleJuice", getForestryItem("waxCapsuleJuice"));
- OreDictionary.registerOre("capsuleSeedOil", getForestryItem("waxCapsuleSeedOil"));
- OreDictionary.registerOre("capsuleEthanol", getForestryItem("waxCapsuleEthanol"));
- OreDictionary.registerOre("capsuleBiomass", getForestryItem("waxCapsuleBiomass"));
- OreDictionary.registerOre("capsuleShortMead", getForestryItem("waxCapsuleShortMead"));
- OreDictionary.registerOre("capsuleMead", getForestryItem("waxCapsuleMead"));
- OreDictionary.registerOre("capsuleFuel", getForestryItem("waxCapsuleFuel"));
- OreDictionary.registerOre("capsuleOil", getForestryItem("waxCapsuleOil"));
- OreDictionary.registerOre("capsuleLava", getForestryItem("refractoryLava"));
- }
-
- private static ItemStack getForestryItem(String itemName) {
- return GT_ModHandler.getModItem(Forestry.ID, itemName, 1);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java
deleted file mode 100644
index ba08d083c2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java
+++ /dev/null
@@ -1,1158 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.GT_Enhancement;
-
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.AcidicIridiumSolution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.AcidicOsmiumSolution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.AmmoniumChloride;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.AquaRegia;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.CalciumChloride;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.CrudeRhMetall;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FormicAcid;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.HotRutheniumTetroxideSollution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.IrLeachResidue;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.IrOsLeachResidue;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.IridiumChloride;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.IridiumDioxide;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.LeachResidue;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.OsmiumSolution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PDAmmonia;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PDMetallicPowder;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PDRawPowder;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PDSalt;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PGSDResidue;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PGSDResidue2;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PTConcentrate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PTMetallicPowder;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PTRawPowder;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PTResidue;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PTSaltCrude;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PTSaltRefined;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.PotassiumDisulfate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RHFilterCakeSolution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RHNitrate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RHSalt;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RHSaltSolution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RHSulfate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RHSulfateSolution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.ReRh;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RhFilterCake;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Rhodium;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Ruthenium;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RutheniumTetroxide;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RutheniumTetroxideSollution;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.SodiumNitrate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.SodiumRuthenate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Sodiumformate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Sodiumsulfate;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.ZincSulfate;
-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.OrePrefixes.cell;
-import static gregtech.api.enums.OrePrefixes.crateGtDust;
-import static gregtech.api.enums.OrePrefixes.crushed;
-import static gregtech.api.enums.OrePrefixes.crushedCentrifuged;
-import static gregtech.api.enums.OrePrefixes.crushedPurified;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustImpure;
-import static gregtech.api.enums.OrePrefixes.dustPure;
-import static gregtech.api.enums.OrePrefixes.dustRefined;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.dustTiny;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.nugget;
-import static gregtech.api.enums.OrePrefixes.rawOre;
-import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
-import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
-import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
-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.UniversalChemical;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.minecraft.block.Block;
-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.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.oredict.ShapedOreRecipe;
-import net.minecraftforge.oredict.ShapelessOreRecipe;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Items;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.CachedReflectionUtils;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-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.ISubTagContainer;
-import gregtech.api.items.GT_Generic_Block;
-import gregtech.api.items.GT_Generic_Item;
-import gregtech.api.objects.ItemData;
-import gregtech.api.objects.MaterialStack;
-import gregtech.api.recipe.RecipeMap;
-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.common.blocks.GT_Block_Ores_Abstract;
-
-public class PlatinumSludgeOverHaul {
-
- private static final Materials[] BLACKLIST = { Materials.HSSS, Materials.EnderiumBase, Materials.Osmiridium,
- Materials.TPV, Materials.get("Uraniumtriplatinid"), Materials.get("Tetranaquadahdiindiumhexaplatiumosminid"),
- Materials.get("Longasssuperconductornameforuvwire"), };
- private static final OrePrefixes[] OPBLACKLIST = { crushedCentrifuged, crushed, crushedPurified, dustPure,
- dustImpure, dustRefined, dust, dustTiny, dustSmall };
-
- private PlatinumSludgeOverHaul() {}
-
- private static void runHelperrecipes() {
- // DilutedSulfuricAcid
- // 2H2SO4 + H2O = 3H2SO4(d)
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.SulfuricAcid.getCells(2),
- Materials.Water.getCells(1),
- GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(Materials.DilutedSulfuricAcid.getCells(3))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidInputs(Materials.SulfuricAcid.getFluid(2000))
- .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(3000))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.SulfuricAcid.getCells(2), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(Materials.Empty.getCells(2))
- .fluidInputs(Materials.Water.getFluid(1000))
- .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(3000))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
- // FormicAcid
- // CO + NaOH = CHO2Na
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.CarbonMonoxide.getCells(1), Materials.SodiumHydroxide.getDust(3))
- .itemOutputs(Sodiumformate.get(cell))
- .duration(15 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
- // H2SO4 + 2CHO2Na = 2CH2O2 + Na2SO4
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Sodiumformate.get(cell, 2), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(FormicAcid.get(cell, 2), Sodiumsulfate.get(dust, 7))
- .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
- .duration(15 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(Materials.Empty.getCells(1), Sodiumsulfate.get(dust, 7))
- .fluidInputs(Sodiumformate.getFluidOrGas(2000))
- .fluidOutputs(FormicAcid.getFluidOrGas(2000))
- .duration(15 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- // AquaRegia
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.DilutedSulfuricAcid.getCells(1),
- Materials.NitricAcid.getCells(1),
- GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(AquaRegia.get(cell, 2))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- Materials.DilutedSulfuricAcid.getCells(1),
- Materials.NitricAcid.getCells(1),
- GT_Utility.getIntegratedCircuit(2))
- .itemOutputs(Materials.Empty.getCells(2))
- .fluidOutputs(AquaRegia.getFluidOrGas(2000))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.NitricAcid.getCells(1), GT_Utility.getIntegratedCircuit(3))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidInputs(Materials.DilutedSulfuricAcid.getFluid(1000))
- .fluidOutputs(AquaRegia.getFluidOrGas(2000))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.DilutedSulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(4))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidInputs(Materials.NitricAcid.getFluid(1000))
- .fluidOutputs(AquaRegia.getFluidOrGas(2000))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- // AmmoniumChloride
- // NH3 + HCl = NH4Cl
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(AmmoniumChloride.get(cell, 1))
- .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
- .duration(15 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidInputs(Materials.Ammonia.getGas(1000))
- .fluidOutputs(AmmoniumChloride.getFluidOrGas(1000))
- .duration(15 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.addMultiblockChemicalRecipe(
- new ItemStack[] { GT_Utility.getIntegratedCircuit(9) },
- new FluidStack[] { Materials.Ammonia.getGas(64000), Materials.HydrochloricAcid.getFluid(64000) },
- new FluidStack[] { AmmoniumChloride.getFluidOrGas(64000) },
- null,
- 60,
- 480);
- // base solution
- for (Werkstoff w : Werkstoff.werkstoffHashSet) if (w.containsStuff(Materials.Sulfur)
- && (w.containsStuff(Materials.Copper) || w.containsStuff(Materials.Nickel))) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(w.get(crushedPurified), GT_Utility.getIntegratedCircuit(1))
- .fluidInputs(AquaRegia.getFluidOrGas(150))
- .fluidOutputs(PTConcentrate.getFluidOrGas(150))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(w.get(crushedPurified, 9), GT_Utility.getIntegratedCircuit(9))
- .fluidInputs(AquaRegia.getFluidOrGas(1350))
- .fluidOutputs(PTConcentrate.getFluidOrGas(1350))
- .duration(11 * SECONDS + 5 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(w.get(crushedPurified, 9), PTMetallicPowder.get(dust, 9))
- .itemOutputs(PTResidue.get(dust))
- .fluidInputs(AquaRegia.getFluidOrGas(10350))
- .fluidOutputs(PTConcentrate.getFluidOrGas(10350))
- .duration(1 * MINUTES + 52 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- }
- for (Materials m : Materials.values()) if (PlatinumSludgeOverHaul.materialsContains(m, Materials.Sulfur)
- && (PlatinumSludgeOverHaul.materialsContains(m, Materials.Copper)
- || PlatinumSludgeOverHaul.materialsContains(m, Materials.Nickel))) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_OreDictUnificator.get(crushedPurified, m, 1), GT_Utility.getIntegratedCircuit(1))
- .fluidInputs(AquaRegia.getFluidOrGas(150))
- .fluidOutputs(PTConcentrate.getFluidOrGas(150))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_OreDictUnificator.get(crushedPurified, m, 9), GT_Utility.getIntegratedCircuit(9))
- .fluidInputs(AquaRegia.getFluidOrGas(1350))
- .fluidOutputs(PTConcentrate.getFluidOrGas(1350))
- .duration(1 * MINUTES + 52 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_OreDictUnificator.get(crushedPurified, m, 9), PTMetallicPowder.get(dust, 9))
- .itemOutputs(PTResidue.get(dust))
- .fluidInputs(AquaRegia.getFluidOrGas(10350))
- .fluidOutputs(PTConcentrate.getFluidOrGas(10350))
- .duration(1 * MINUTES + 52 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- }
- // Pt
- GT_Values.RA.stdBuilder()
- .itemInputs(PTMetallicPowder.get(dust, 3), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(Materials.Platinum.getNuggets(2))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, Materials.Platinum.mMeltingPoint)
- .addTo(blastFurnaceRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PTMetallicPowder.get(dust), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(PTResidue.get(dustTiny))
- .fluidInputs(AquaRegia.getFluidOrGas(1000))
- .fluidOutputs(PTConcentrate.getFluidOrGas(1000))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PTMetallicPowder.get(dust, 9), GT_Utility.getIntegratedCircuit(9))
- .itemOutputs(PTResidue.get(dust))
- .fluidInputs(AquaRegia.getFluidOrGas(9000))
- .fluidOutputs(PTConcentrate.getFluidOrGas(9000))
- .duration(1 * MINUTES + 52 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PTConcentrate.get(cell, 2))
- .itemOutputs(
- PTSaltCrude.get(dustTiny, 16),
- PTRawPowder.get(dustTiny, 4),
- Materials.NitrogenDioxide.getCells(1),
- Materials.DilutedSulfuricAcid.getCells(1))
- .fluidInputs(AmmoniumChloride.getFluidOrGas(400))
- .fluidOutputs(PDAmmonia.getFluidOrGas(400))
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.addMultiblockChemicalRecipe(
- new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
- new FluidStack[] { PTConcentrate.getFluidOrGas(2000), AmmoniumChloride.getFluidOrGas(400) },
- new FluidStack[] { PDAmmonia.getFluidOrGas(400), Materials.NitrogenDioxide.getGas(1000),
- Materials.DilutedSulfuricAcid.getFluid(1000) },
- new ItemStack[] { PTSaltCrude.get(dustTiny, 16), PTRawPowder.get(dustTiny, 4) },
- 1200,
- 30);
- GT_Values.RA.addMultiblockChemicalRecipe(
- new ItemStack[] { GT_Utility.getIntegratedCircuit(2) },
- new FluidStack[] { PTConcentrate.getFluidOrGas(18000), AmmoniumChloride.getFluidOrGas(3600) },
- new FluidStack[] { PDAmmonia.getFluidOrGas(3600), Materials.NitrogenDioxide.getGas(9000),
- Materials.DilutedSulfuricAcid.getFluid(9000) },
- new ItemStack[] { PTSaltCrude.get(dust, 16), PTRawPowder.get(dust, 4) },
- 1400,
- 240);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PTSaltCrude.get(dust))
- .itemOutputs(
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust),
- PTSaltRefined.get(dust))
- .outputChances(1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1500)
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(sifterRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PTSaltRefined.get(dust), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(PTMetallicPowder.get(dust))
- .fluidOutputs(Materials.Chlorine.getGas(87))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, 900)
- .addTo(blastFurnaceRecipes);
-
- // 2PtCl + Ca = 2Pt + CaCl2
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PTRawPowder.get(dust, 4), Materials.Calcium.getDust(1))
- .itemOutputs(Materials.Platinum.getDust(2), CalciumChloride.get(dust, 3))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
- // Pd
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PDMetallicPowder.get(dust), GT_Utility.getIntegratedCircuit(1))
- .fluidInputs(Materials.Ammonia.getGas(1000))
- .fluidOutputs(PDAmmonia.getFluidOrGas(1000))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PDMetallicPowder.get(dust), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(PDSalt.get(dustTiny, 16), PDRawPowder.get(dustTiny, 2))
- .fluidInputs(PDAmmonia.getFluidOrGas(1000))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PDMetallicPowder.get(dust, 9), GT_Utility.getIntegratedCircuit(9))
- .itemOutputs(PDSalt.get(dust, 16), PDRawPowder.get(dust, 2))
- .fluidInputs(PDAmmonia.getFluidOrGas(9000))
- .duration(1 * MINUTES + 52 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(2))
- .itemOutputs(PDSalt.get(dust))
- .fluidInputs(PDAmmonia.getFluidOrGas(1000))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(PDSalt.get(dust))
- .itemOutputs(
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust),
- PDMetallicPowder.get(dust))
- .outputChances(1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1500)
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(sifterRecipes);
-
- GT_Values.RA.addChemicalRecipeForBasicMachineOnly(
- PDRawPowder.get(dust, 4),
- Materials.Empty.getCells(1),
- FormicAcid.getFluidOrGas(4000),
- Materials.Ammonia.getGas(4000),
- Materials.Palladium.getDust(2),
- Materials.Ethylene.getCells(1),
- 250,
- 30);
- GT_Values.RA.addMultiblockChemicalRecipe(
- new ItemStack[] { PDRawPowder.get(dust, 4) },
- new FluidStack[] { FormicAcid.getFluidOrGas(4000) },
- new FluidStack[] { Materials.Ammonia.getGas(4000), Materials.Ethylene.getGas(1000),
- Materials.Water.getFluid(1000) },
- new ItemStack[] { Materials.Palladium.getDust(2) },
- 250,
- 30);
- // Na2SO4 + 2H = 2Na + H2SO4
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Sodiumsulfate.get(dust, 7), Materials.Hydrogen.getCells(2))
- .itemOutputs(Materials.Sodium.getDust(2), Materials.Empty.getCells(2))
- .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
- .duration(1 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- // K2S2O7
- // GT_Values.RA.addChemicalRecipe(Sodiumsulfate.get(dust), Materials.Potassium.getDust(2),
- // Materials.Oxygen.getGas(3000), null, PotassiumDisulfate.get(dust,6), null, 30);
- // Rh/Os/Ir/Ru
- GT_Values.RA.stdBuilder()
- .itemInputs(PTResidue.get(dust), GT_Utility.getIntegratedCircuit(11))
- .itemOutputs(LeachResidue.get(dust))
- .fluidInputs(PotassiumDisulfate.getMolten(360))
- .fluidOutputs(RHSulfate.getFluidOrGas(360))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, 775)
- .addTo(blastFurnaceRecipes);
-
- // Ru
- GT_Values.RA.stdBuilder()
- .itemInputs(LeachResidue.get(dust, 10), Materials.Saltpeter.getDust(10))
- .itemOutputs(SodiumRuthenate.get(dust, 3), IrOsLeachResidue.get(dust, 6))
- .fluidInputs(Materials.SaltWater.getFluid(1000))
- .fluidOutputs(GT_ModHandler.getSteam(1000))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, 775)
- .addTo(blastFurnaceRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(SodiumRuthenate.get(dust, 6), Materials.Chlorine.getCells(3))
- .itemOutputs(Materials.Empty.getCells(3))
- .fluidOutputs(RutheniumTetroxideSollution.getFluidOrGas(9000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(1))
- .fluidInputs(RutheniumTetroxideSollution.getFluidOrGas(800))
- .fluidOutputs(HotRutheniumTetroxideSollution.getFluidOrGas(800))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(fluidHeaterRecipes);
-
- GT_Values.RA.addCrackingRecipe(
- 17,
- RutheniumTetroxideSollution.getFluidOrGas(1000),
- GT_ModHandler.getSteam(1000),
- HotRutheniumTetroxideSollution.getFluidOrGas(2000),
- 150,
- 480);
- GT_Values.RA.addDistillationTowerRecipe(
- HotRutheniumTetroxideSollution.getFluidOrGas(9000),
- new FluidStack[] { Materials.Water.getFluid(1800), RutheniumTetroxide.getFluidOrGas(7200) },
- Materials.Salt.getDust(6),
- 1500,
- 480);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(RutheniumTetroxide.get(dust, 1), Materials.HydrochloricAcid.getCells(6))
- .itemOutputs(Ruthenium.get(dust), Materials.Chlorine.getCells(6))
- .fluidOutputs(Materials.Water.getFluid(2000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- // Os
- GT_Values.RA.stdBuilder()
- .itemInputs(IrOsLeachResidue.get(dust, 4), GT_Utility.getIntegratedCircuit(11))
- .itemOutputs(IrLeachResidue.get(dust, 2))
- .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
- .fluidOutputs(AcidicOsmiumSolution.getFluidOrGas(2000))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, 775)
- .addTo(blastFurnaceRecipes);
-
- GT_Values.RA.addDistillationTowerRecipe(
- AcidicOsmiumSolution.getFluidOrGas(1000),
- new FluidStack[] { OsmiumSolution.getFluidOrGas(100), Materials.Water.getFluid(900) },
- null,
- 150,
- (int) TierEU.RECIPE_IV);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(OsmiumSolution.get(cell), Materials.HydrochloricAcid.getCells(6))
- .itemOutputs(Materials.Osmium.getDust(1), Materials.Chlorine.getCells(7))
- .fluidOutputs(Materials.Water.getFluid(2000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- // Ir
- GT_Values.RA.stdBuilder()
- .itemInputs(IrLeachResidue.get(dust), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(PGSDResidue.get(dust), IridiumDioxide.get(dust))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, 775)
- .addTo(blastFurnaceRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(IridiumDioxide.get(dust), Materials.HydrochloricAcid.getCells(1))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidOutputs(AcidicIridiumSolution.getFluidOrGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(AcidicIridiumSolution.get(cell), AmmoniumChloride.get(cell, 3))
- .itemOutputs(Materials.Empty.getCells(4), IridiumChloride.get(dust))
- .fluidOutputs(Materials.Ammonia.getGas(3000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(IridiumChloride.get(dust), Materials.Calcium.getDust(1))
- .itemOutputs(PGSDResidue2.get(dust), Materials.Iridium.getDust(1))
- .fluidOutputs(CalciumChloride.getFluidOrGas(3000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_EV)
- .addTo(UniversalChemical);
- // Rh
-
- GT_Values.RA.stdBuilder()
- .itemInputs(RHSulfate.get(cell, 11), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(RHSulfateSolution.get(cell, 11), LeachResidue.get(dustTiny, 10))
- .fluidInputs(Materials.Water.getFluid(10000))
- .fluidOutputs(Materials.Potassium.getMolten(2000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.addMultiblockChemicalRecipe(
- new ItemStack[] { GT_Utility.getIntegratedCircuit(3) },
- new FluidStack[] { Materials.Water.getFluid(36000), RHSulfate.getFluidOrGas(39600) },
- new FluidStack[] { Materials.Potassium.getMolten(7200), RHSulfateSolution.getFluidOrGas(39600) },
- new ItemStack[] { LeachResidue.get(dust, 4) },
- 1200,
- 30);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Zinc.getDust(1))
- .itemOutputs(ZincSulfate.get(dust, 6), CrudeRhMetall.get(dust))
- .fluidInputs(RHSulfateSolution.getFluidOrGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(CrudeRhMetall.get(dust), Materials.Salt.getDust(1))
- .itemOutputs(RHSalt.get(dust, 3))
- .fluidInputs(Materials.Chlorine.getGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .metadata(COIL_HEAT, 600)
- .addTo(blastFurnaceRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(RHSalt.get(dust, 10))
- .fluidInputs(Materials.Water.getFluid(2000))
- .fluidOutputs(RHSaltSolution.getFluidOrGas(2000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(SodiumNitrate.get(dust, 5), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(RHNitrate.get(dust), Materials.Salt.getDust(2))
- .fluidInputs(RHSaltSolution.getFluidOrGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
- // Na + HNO3 = NaNO3 + H
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Sodium.getDust(1))
- .itemOutputs(SodiumNitrate.get(dust, 5))
- .fluidInputs(Materials.NitricAcid.getFluid(1000))
- .fluidOutputs(Materials.Hydrogen.getGas(1000))
- .duration(8 * TICKS)
- .eut(60)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(RHNitrate.get(dust))
- .itemOutputs(
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust),
- RhFilterCake.get(dust))
- .outputChances(1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1500)
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(sifterRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(RhFilterCake.get(dust))
- .fluidInputs(Materials.Water.getFluid(1000))
- .fluidOutputs(RHFilterCakeSolution.getFluidOrGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(mixerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(2))
- .itemOutputs(ReRh.get(dust))
- .fluidInputs(RHFilterCakeSolution.getFluidOrGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ReRh.get(dust), Materials.Empty.getCells(1))
- .itemOutputs(Rhodium.get(dust), Materials.Ammonia.getCells(1))
- .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
- .fluidOutputs(Materials.Chlorine.getGas(1000))
- .duration(15 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(UniversalChemical);
-
- }
-
- private static boolean materialsContains(Materials one, ISubTagContainer other) {
- if (one == null || one.mMaterialList == null || one.mMaterialList.isEmpty()) return false;
- for (MaterialStack stack : one.mMaterialList) if (stack.mMaterial.equals(other)) return true;
- return false;
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public static void replacePureElements() {
- // furnace
- for (Object entry : FurnaceRecipes.smelting()
- .getSmeltingList()
- .entrySet()) {
- Map.Entry realEntry = (Map.Entry) entry;
- if (GT_Utility.isStackValid(realEntry.getKey())
- && BW_Util.checkStackAndPrefix((ItemStack) realEntry.getKey())) {
- ItemData association = GT_OreDictUnificator.getAssociation((ItemStack) realEntry.getKey());
- if (!dust.equals(association.mPrefix) && !dustTiny.equals(association.mPrefix)
- || !association.mMaterial.mMaterial.equals(Materials.Platinum))
- if (GT_Utility.isStackValid(realEntry.getValue())
- && BW_Util.checkStackAndPrefix((ItemStack) realEntry.getValue())) {
- ItemData ass = GT_OreDictUnificator.getAssociation((ItemStack) realEntry.getValue());
- if (ass.mMaterial.mMaterial.equals(Materials.Platinum))
- if (!PlatinumSludgeOverHaul.isInBlackList((ItemStack) realEntry.getKey()))
- realEntry.setValue(
- PTMetallicPowder.get(
- ass.mPrefix == nugget ? dustTiny : dust,
- ((ItemStack) realEntry.getValue()).stackSize * 2));
- else if (ass.mMaterial.mMaterial.equals(Materials.Palladium))
- if (!PlatinumSludgeOverHaul.isInBlackList((ItemStack) realEntry.getKey()))
- realEntry.setValue(
- PDMetallicPowder.get(
- ass.mPrefix == nugget ? dustTiny : dust,
- ((ItemStack) realEntry.getValue()).stackSize * 2));
- }
- }
- }
- // vanilla crafting
- CraftingManager.getInstance()
- .getRecipeList()
- .forEach(PlatinumSludgeOverHaul::setnewMaterialInRecipe);
- // gt crafting
- try {
- ((List<IRecipe>) FieldUtils.getDeclaredField(GT_ModHandler.class, "sBufferRecipeList", true)
- .get(null)).forEach(PlatinumSludgeOverHaul::setnewMaterialInRecipe);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- // gt machines
- maploop: for (RecipeMap<?> map : RecipeMap.ALL_RECIPE_MAPS.values()) {
- if (map == RecipeMaps.fusionRecipes || map == RecipeMaps.unpackagerRecipes
- || map == RecipeMaps.packagerRecipes
- || map == RecipeMaps.replicatorRecipes
- || "gt.recipe.eyeofharmony".equals(map.unlocalizedName)
- || "gtpp.recipe.quantumforcesmelter".equals(map.unlocalizedName)) continue;
- HashSet<GT_Recipe> toDel = new HashSet<>();
- recipeloop: for (GT_Recipe recipe : map.getAllRecipes()) {
- if (recipe.mFakeRecipe) continue maploop;
-
- for (int i = 0; i < recipe.mFluidOutputs.length; i++) {
- if (map.equals(RecipeMaps.fluidExtractionRecipes)) continue maploop;
- if ("gtpp.recipe.alloyblastsmelter".equals(map.unlocalizedName)) continue maploop;
- if (map.equals(RecipeMaps.multiblockChemicalReactorRecipes)
- || map.equals(RecipeMaps.chemicalReactorRecipes)) {
- if (GT_Utility.areFluidsEqual(Ruthenium.getMolten(1), recipe.mFluidOutputs[i])
- || GT_Utility.areFluidsEqual(Rhodium.getMolten(1), recipe.mFluidOutputs[i]))
- toDel.add(recipe);
- else if (GT_Utility.areFluidsEqual(Materials.Iridium.getMolten(1), recipe.mFluidOutputs[i])) {
- recipe.mFluidOutputs[i] = AcidicIridiumSolution.getFluidOrGas(1000);
- recipe.reloadOwner();
- } else
- if (GT_Utility.areFluidsEqual(Materials.Platinum.getMolten(1), recipe.mFluidOutputs[i])) {
- recipe.mFluidOutputs[i] = PTConcentrate.getFluidOrGas(1000);
- recipe.reloadOwner();
- } else
- if (GT_Utility.areFluidsEqual(Materials.Osmium.getMolten(1), recipe.mFluidOutputs[i])) {
- recipe.mFluidOutputs[i] = AcidicOsmiumSolution.getFluidOrGas(1000);
- recipe.reloadOwner();
- }
- } else if (GT_Utility.areFluidsEqual(Ruthenium.getMolten(1), recipe.mFluidOutputs[i])
- || GT_Utility.areFluidsEqual(Rhodium.getMolten(1), recipe.mFluidOutputs[i])
- || GT_Utility.areFluidsEqual(Materials.Iridium.getMolten(1), recipe.mFluidOutputs[i])
- || GT_Utility.areFluidsEqual(Materials.Platinum.getMolten(1), recipe.mFluidOutputs[i]))
- toDel.add(recipe);
- else if (GT_Utility.areFluidsEqual(Materials.Osmium.getMolten(1), recipe.mFluidOutputs[i]))
- toDel.add(recipe);
- }
- for (int i = 0; i < recipe.mOutputs.length; i++) {
- if (!GT_Utility.isStackValid(recipe.mOutputs[i])) continue;
- if ((BW_Util.areStacksEqualOrNull(Ruthenium.get(dust), recipe.mOutputs[i])
- || BW_Util.areStacksEqualOrNull(Ruthenium.get(dustImpure), recipe.mOutputs[i])
- || BW_Util.areStacksEqualOrNull(Ruthenium.get(dustPure), recipe.mOutputs[i]))
- && !BW_Util.areStacksEqualOrNull(Ruthenium.get(ingot), recipe.mInputs[0])) {
- for (ItemStack mInput : recipe.mInputs)
- if (PlatinumSludgeOverHaul.isInBlackList(mInput)) continue recipeloop;
- int amount = recipe.mOutputs[i].stackSize * 2;
- recipe.mOutputs[i] = LeachResidue.get(dust, amount);
- recipe.reloadOwner();
- }
- if ((BW_Util.areStacksEqualOrNull(Rhodium.get(dust), recipe.mOutputs[i])
- || BW_Util.areStacksEqualOrNull(Rhodium.get(dustImpure), recipe.mOutputs[i])
- || BW_Util.areStacksEqualOrNull(Rhodium.get(dustPure), recipe.mOutputs[i]))
- && !BW_Util.areStacksEqualOrNull(Rhodium.get(ingot), recipe.mInputs[0])) {
- for (ItemStack mInput : recipe.mInputs)
- if (PlatinumSludgeOverHaul.isInBlackList(mInput)) continue recipeloop;
- int amount = recipe.mOutputs[i].stackSize * 2;
- recipe.mOutputs[i] = CrudeRhMetall.get(dust, amount);
- recipe.reloadOwner();
- }
- if (!BW_Util.checkStackAndPrefix(recipe.mOutputs[i])) continue;
- // Pt
- if (GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mMaterial.mMaterial
- .equals(Materials.Platinum)) {
- for (ItemStack mInput : recipe.mInputs) {
- if (PlatinumSludgeOverHaul.isInBlackList(mInput)) continue recipeloop;
- }
- if (dust.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustImpure.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustPure.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util.setStackSize(PTMetallicPowder.get(dust), amount * 2);
- recipe.reloadOwner();
- } else if (dustSmall.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util.setStackSize(PTMetallicPowder.get(dustSmall), amount * 2);
- recipe.reloadOwner();
- } else if (dustTiny.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util.setStackSize(PTMetallicPowder.get(dustTiny), amount * 2);
- recipe.reloadOwner();
- }
- } else if (GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mMaterial.mMaterial
- .equals(Materials.Palladium)) {
- for (ItemStack mInput : recipe.mInputs) {
- if (PlatinumSludgeOverHaul.isInBlackList(mInput)) continue recipeloop;
- }
- if (dust.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustImpure.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustPure.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util.setStackSize(PDMetallicPowder.get(dust), amount * 4);
- recipe.reloadOwner();
- } else
- if (dustSmall.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util
- .setStackSize(PDMetallicPowder.get(dustSmall), amount * 4);
- recipe.reloadOwner();
- } else if (dustTiny
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util
- .setStackSize(PDMetallicPowder.get(dustTiny), amount * 4);
- recipe.reloadOwner();
- }
- } else if (GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mMaterial.mMaterial
- .equals(Materials.Osmium)) {
- for (ItemStack mInput : recipe.mInputs) {
- if (PlatinumSludgeOverHaul.isInBlackList(mInput)) continue recipeloop;
- }
- if (dust.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustImpure
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustPure
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util.setStackSize(IrOsLeachResidue.get(dust), amount);
- recipe.reloadOwner();
- } else if (dustSmall
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util
- .setStackSize(IrOsLeachResidue.get(dustSmall), amount);
- recipe.reloadOwner();
- } else if (dustTiny
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util
- .setStackSize(IrOsLeachResidue.get(dustTiny), amount);
- recipe.reloadOwner();
- }
- } else if (GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mMaterial.mMaterial
- .equals(Materials.Iridium)) {
- for (ItemStack mInput : recipe.mInputs) {
- if (PlatinumSludgeOverHaul.isInBlackList(mInput)) continue recipeloop;
- }
- if (dust.equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustImpure
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)
- || dustPure
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util.setStackSize(IrLeachResidue.get(dust), amount);
- recipe.reloadOwner();
- } else if (dustSmall
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util
- .setStackSize(IrLeachResidue.get(dustSmall), amount);
- recipe.reloadOwner();
- } else if (dustTiny
- .equals(GT_OreDictUnificator.getAssociation(recipe.mOutputs[i]).mPrefix)) {
- int amount = recipe.mOutputs[i].stackSize;
- recipe.mOutputs[i] = BW_Util
- .setStackSize(IrLeachResidue.get(dustTiny), amount);
- recipe.reloadOwner();
- }
- }
- }
- }
- map.getBackend()
- .removeRecipes(toDel);
- }
- // TODO: remove EnderIO recipes
-
- // fix HV tier
- PlatinumSludgeOverHaul.replaceHVCircuitMaterials();
- // add new recipes
- PlatinumSludgeOverHaul.runHelperrecipes();
- }
-
- @SuppressWarnings("deprecation")
- private static void replaceHVCircuitMaterials() {
- GT_Values.RA.addMixerRecipe(
- Materials.Redstone.getDust(1),
- Materials.Electrum.getDust(1),
- GT_Utility.getIntegratedCircuit(1),
- null,
- null,
- null,
- Materials.Nikolite.getDust(8),
- 1800,
- 120);
- for (GT_Recipe recipe : RecipeMaps.circuitAssemblerRecipes.getAllRecipes()) {
- if (recipe.mEUt > 512) continue;
- if (BW_Util.checkStackAndPrefix(recipe.mOutputs[0])) {
- for (int i = 0; i < recipe.mInputs.length; i++) {
- ItemStack stack = recipe.mInputs[i];
- ItemData ass = GT_OreDictUnificator.getAssociation(stack);
- if (BW_Util.checkStackAndPrefix(stack) && ass.mMaterial.mMaterial.equals(Materials.Platinum)) {
- recipe.mInputs[i] = GT_OreDictUnificator.get(ass.mPrefix, Materials.BlueAlloy, stack.stackSize);
- recipe.reloadOwner();
- }
- }
- }
- }
- }
-
- private static void setnewMaterialInRecipe(Object obj) {
- String inputName = "output";
- String inputItemName = "input";
- if (!(obj instanceof ShapedOreRecipe) && !(obj instanceof ShapelessOreRecipe)) {
- if (obj instanceof ShapedRecipes || obj instanceof ShapelessRecipes) {
- inputName = "recipeOutput";
- inputItemName = "recipeItems";
- } else if (GTPlusPlus.isModLoaded()) {
- try {
- if (Class.forName("gtPlusPlus.api.objects.minecraft.ShapedRecipe")
- .isAssignableFrom(obj.getClass()))
- obj = CachedReflectionUtils.getField(obj.getClass(), "mRecipe")
- .get(obj);
- } catch (ClassNotFoundException | IllegalAccessException e) {
- e.printStackTrace();
- }
- }
- }
-
- IRecipe recipe = (IRecipe) obj;
- ItemStack otpt = recipe.getRecipeOutput();
-
- Field out = CachedReflectionUtils.getDeclaredField(recipe.getClass(), inputName);
- if (out == null) out = CachedReflectionUtils.getField(recipe.getClass(), inputName);
-
- Field in = CachedReflectionUtils.getDeclaredField(recipe.getClass(), inputItemName);
- if (in == null) in = CachedReflectionUtils.getField(recipe.getClass(), inputItemName);
- if (in == null) return;
-
- Object input;
- try {
- input = in.get(obj);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- return;
- }
-
- if (out != null && GT_Utility.areStacksEqual(otpt, Materials.Platinum.getDust(1), true)) {
- if (PlatinumSludgeOverHaul.checkRecipe(input, Materials.Platinum)) return;
- try {
- out.set(recipe, PTMetallicPowder.get(dust, otpt.stackSize * 2));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- } else if (out != null && GT_Utility.areStacksEqual(otpt, Materials.Palladium.getDust(1), true)) {
- if (PlatinumSludgeOverHaul.checkRecipe(input, Materials.Palladium)) return;
- try {
- out.set(recipe, PDMetallicPowder.get(dust, otpt.stackSize * 2));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- } else if (out != null && GT_Utility.areStacksEqual(otpt, Materials.Iridium.getDust(1), true)) {
- if (PlatinumSludgeOverHaul.checkRecipe(input, Materials.Iridium)) return;
- try {
- out.set(recipe, IrLeachResidue.get(dust, otpt.stackSize));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- } else if (out != null && GT_Utility.areStacksEqual(otpt, Materials.Osmium.getDust(1), true)) {
- if (PlatinumSludgeOverHaul.checkRecipe(input, Materials.Osmium)) return;
- try {
- out.set(recipe, IrOsLeachResidue.get(dust, otpt.stackSize));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- private static boolean checkRecipe(Object input, Materials mat) {
- if (input instanceof List || input instanceof Object[]) {
- Set lists = new HashSet(), stacks = new HashSet();
- List ip = input instanceof List ? (List) input : new ArrayList();
- Object[] ip2 = input instanceof Object[] ? (Object[]) input : new Object[0];
-
- for (Object o : ip) {
- if (o instanceof List) lists.add(o);
- else if (o instanceof ItemStack) stacks.add(o);
- }
- for (Object o : ip2) {
- if (o instanceof List) lists.add(o);
- else if (o instanceof ItemStack) stacks.add(o);
- }
-
- for (Object o : lists) {
- if (!((List) o).isEmpty()) stacks.add(((List) o).get(0));
- }
-
- for (Object stack : stacks) {
- if (stack instanceof ItemStack
- && GT_Utility.areStacksEqual(GT_OreDictUnificator.get(crateGtDust, mat, 1), (ItemStack) stack))
- return true;
- }
-
- boolean allSame = false;
- for (Object stack : stacks) {
- if (!(stack instanceof ItemStack)) {
- allSame = false;
- break;
- }
- allSame = BW_Util.checkStackAndPrefix((ItemStack) stack)
- && GT_OreDictUnificator.getAssociation((ItemStack) stack).mMaterial.mMaterial.equals(mat);
- if (!allSame) break;
- }
- return allSame;
- }
- return false;
- }
-
- private static boolean isInBlackList(ItemStack stack) {
- if (stack == null || stack.getItem() instanceof BW_MetaGenerated_Items
- || MainMod.MOD_ID.equals(GameRegistry.findUniqueIdentifierFor(stack.getItem()).modId)
- || BartWorksCrossmod.MOD_ID.equals(GameRegistry.findUniqueIdentifierFor(stack.getItem()).modId))
- return true;
-
- if (GameRegistry.findUniqueIdentifierFor(stack.getItem()).modId.equals(NewHorizonsCoreMod.ID)
- && !stack.getUnlocalizedName()
- .contains("dust")
- && !stack.getUnlocalizedName()
- .contains("Dust"))
- return true;
-
- if (Block.getBlockFromItem(stack.getItem()) instanceof GT_Generic_Block
- && !(Block.getBlockFromItem(stack.getItem()) instanceof GT_Block_Ores_Abstract)) return true;
-
- if (Arrays.stream(ItemList.values())
- .filter(ItemList::hasBeenSet)
- .anyMatch(e -> !BW_Util.checkStackAndPrefix(stack) && GT_Utility.areStacksEqual(e.get(1), stack, true)))
- return true;
-
- if (stack.getItem() instanceof GT_Generic_Item) {
- if (!BW_Util.checkStackAndPrefix(stack)) return false;
- if (GT_OreDictUnificator.getAssociation(stack).mPrefix != rawOre) {
- return !Arrays.asList(PlatinumSludgeOverHaul.OPBLACKLIST)
- .contains(GT_OreDictUnificator.getAssociation(stack).mPrefix)
- || Arrays.asList(PlatinumSludgeOverHaul.BLACKLIST)
- .contains(GT_OreDictUnificator.getAssociation(stack).mMaterial.mMaterial);
- }
- }
-
- if (GTPlusPlus.isModLoaded()) {
- try {
- if (Class.forName("gtPlusPlus.core.item.base.BaseItemComponent")
- .isAssignableFrom(
- stack.getItem()
- .getClass())
- && !stack.getUnlocalizedName()
- .contains("dust")
- && !stack.getUnlocalizedName()
- .contains("Dust"))
- return true;
- if (Class.forName("gtPlusPlus.core.block.base.BlockBaseModular")
- .isAssignableFrom(
- Block.getBlockFromItem(stack.getItem())
- .getClass()))
- return true;
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- if (stack.getItem() == GT_ModHandler.getModItem(GTPlusPlus.ID, "itemDustHeLiCoPtEr", 1L)
- .getItem()) {
- return true;
- }
- if (stack.getItem() == GT_ModHandler.getModItem(GTPlusPlus.ID, "itemDustWhiteMetal", 1L)
- .getItem()) {
- return true;
- }
- }
- if (GalaxySpace.isModLoaded()) {
- if (stack.getItem() == GT_ModHandler.getModItem(GalaxySpace.ID, "metalsblock", 1L, 7)
- .getItem()) {
- return true;
- }
- }
- if (NewHorizonsCoreMod.isModLoaded()) {
- if (stack.getItem() == GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IndustryFrame", 1L)
- .getItem()) {
- return true;
- }
- }
- if (!BW_Util.checkStackAndPrefix(stack)) {
- return false;
- }
- return Arrays.asList(PlatinumSludgeOverHaul.BLACKLIST)
- .contains(GT_OreDictUnificator.getAssociation(stack).mMaterial.mMaterial);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java
deleted file mode 100644
index af8651dc6b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static gregtech.api.enums.Mods.GalaxySpace;
-import static net.minecraft.util.EnumChatFormatting.DARK_PURPLE;
-import static net.minecraft.util.EnumChatFormatting.GREEN;
-
-import java.lang.reflect.InvocationTargetException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.common.loaders.StaticRecipeChangeLoaders;
-import com.github.bartimaeusnek.bartworks.system.oredict.OreDictHandler;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.MurmurHash3;
-import com.github.bartimaeusnek.bartworks.util.NonNullWrappedHashMap;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-import com.github.bartimaeusnek.crossmod.tgregworks.MaterialsInjector;
-import com.github.bartimaeusnek.crossmod.thaumcraft.util.ThaumcraftHandler;
-
-import cpw.mods.fml.common.Loader;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.FluidState;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.SubTag;
-import gregtech.api.enums.TC_Aspects;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.interfaces.IColorModulationContainer;
-import gregtech.api.interfaces.ISubTagContainer;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class Werkstoff implements IColorModulationContainer, ISubTagContainer {
-
- public static final LinkedHashSet<Werkstoff> werkstoffHashSet = new LinkedHashSet<>();
- public static final LinkedHashMap<Short, Werkstoff> werkstoffHashMap = new LinkedHashMap<>();
- public static final LinkedHashMap<String, Werkstoff> werkstoffNameHashMap = new LinkedHashMap<>();
-
- public static final Map<String, String> modNameOverrides = new HashMap<>() {
-
- private static final long serialVersionUID = 6399917619058898648L;
-
- {
- this.put(GalaxySpace.ID, DARK_PURPLE + "GalaxySpace");
- }
- };
-
- private static final List<String> BWModNames = Arrays
- .asList(MainMod.NAME, BartWorksCrossmod.NAME, MaterialsInjector.NAME);
-
- private static final HashSet<Short> idHashSet = new HashSet<>();
-
- private static final Werkstoff.Stats DEFAULT_NULL_STATS = new Werkstoff.Stats();
- private static final Werkstoff.GenerationFeatures DEFAULT_NULL_GENERATION_FEATURES = new Werkstoff.GenerationFeatures()
- .disable();
- public static Werkstoff default_null_Werkstoff;
-
- private final HashSet<String> ADDITIONAL_OREDICT = new HashSet<>();
- private final List<ISubTagContainer> mOreByProducts = new ArrayList<>();
- private final LinkedHashSet<Pair<ISubTagContainer, Integer>> CONTENTS = new LinkedHashSet<>();
- private final HashSet<SubTag> SUBTAGS = new HashSet<>();
- private byte[] rgb = new byte[3];
- private final String defaultName;
- private String toolTip;
-
- private Werkstoff.Stats stats;
- private final Werkstoff.Types type;
- private final Werkstoff.GenerationFeatures generationFeatures;
- private final short mID;
- private final TextureSet texSet;
- private Materials bridgeMaterial;
- private final String owner;
-
- public Materials getBridgeMaterial() {
- return this.bridgeMaterial;
- }
-
- public void setBridgeMaterial(Materials bridgeMaterial) {
- this.bridgeMaterial = bridgeMaterial;
- }
-
- public static void init() {
- Werkstoff.default_null_Werkstoff = new Werkstoff(
- new short[3],
- "_NULL",
- "Default null Werkstoff",
- Werkstoff.DEFAULT_NULL_STATS,
- Werkstoff.Types.UNDEFINED,
- Werkstoff.DEFAULT_NULL_GENERATION_FEATURES,
- -1,
- TextureSet.SET_NONE);
- }
-
- /**
- * GT Materials Bridge Constructor
- *
- * @param materials a GT Materials
- * @param generationFeatures the new Types you want to add
- * @param type - self explainatory
- * @param mID > 31_766 && <= 32_767
- */
- public Werkstoff(Materials materials, Werkstoff.GenerationFeatures generationFeatures, Types type, int mID) {
- this(
- materials.mRGBa,
- materials.mDefaultLocalName,
- materials.getToolTip(),
- type == null ? materials.mElement != null ? Types.ELEMENT : Types.UNDEFINED : type,
- generationFeatures,
- mID,
- materials.mIconSet,
- (List) materials.mOreByProducts,
- new Pair<>(materials, 1));
- if (mID <= 31_766 || mID > 32_767) throw new IllegalArgumentException();
- this.stats.mass = materials.getMass();
- this.stats.protons = materials.getProtons();
- this.stats.meltingPoint = materials.mMeltingPoint;
- this.stats.neutrons = materials.getNeutrons();
- this.stats.speedOverride = materials.mToolSpeed;
- this.stats.durOverride = materials.mDurability;
- this.stats.qualityOverride = materials.mToolQuality;
- this.stats.setGas(materials.mHasGas);
- this.stats.setRadioactive(materials.isRadioactive());
- this.stats.setBlastFurnace(materials.mBlastFurnaceRequired);
- this.stats.setMeltingVoltage(120);
- if (type == Types.COMPOUND) {
- this.stats.setElektrolysis(true);
- this.generationFeatures.addChemicalRecipes();
- } else if (type == Types.MIXTURE) {
- this.stats.setCentrifuge(true);
- this.generationFeatures.addMixerRecipes();
- }
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, Werkstoff.Types type, int meltingpoint,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- Pair<ISubTagContainer, Integer>... contents) {
- this(
- rgba,
- defaultName,
- Werkstoff.Types.getDefaultStatForType(type)
- .setMeltingPoint(meltingpoint),
- type,
- generationFeatures,
- mID,
- texSet,
- contents);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- Pair<ISubTagContainer, Integer>... contents) {
- this(
- rgba,
- defaultName,
- Werkstoff.Types.getDefaultStatForType(type),
- type,
- generationFeatures,
- mID,
- texSet,
- contents);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, Werkstoff.Types type, int meltingpoint,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- List<ISubTagContainer> oreByProduct, Pair<ISubTagContainer, Integer>... contents) {
- this(
- rgba,
- defaultName,
- Werkstoff.Types.getDefaultStatForType(type)
- .setMeltingPoint(meltingpoint),
- type,
- generationFeatures,
- mID,
- texSet,
- oreByProduct,
- contents);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- List<ISubTagContainer> oreByProduct, Pair<ISubTagContainer, Integer>... contents) {
- this(
- rgba,
- defaultName,
- Werkstoff.Types.getDefaultStatForType(type),
- type,
- generationFeatures,
- mID,
- texSet,
- oreByProduct,
- contents);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String toolTip, String defaultName, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- List<ISubTagContainer> oreByProduct, Pair<ISubTagContainer, Integer>... contents) {
- this(
- rgba,
- toolTip,
- defaultName,
- Werkstoff.Types.getDefaultStatForType(type),
- type,
- generationFeatures,
- mID,
- texSet,
- oreByProduct,
- contents);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, Werkstoff.Stats stats, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- List<ISubTagContainer> oreByProduct, Pair<ISubTagContainer, Integer>... contents) {
- this(rgba, defaultName, "", stats, type, generationFeatures, mID, texSet, contents);
- this.mOreByProducts.clear();
- this.mOreByProducts.addAll(oreByProduct);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, Werkstoff.Stats stats, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- Pair<ISubTagContainer, Integer>... contents) {
- this(rgba, defaultName, "", stats, type, generationFeatures, mID, texSet, contents);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, String toolTip, Werkstoff.Stats stats, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- List<ISubTagContainer> oreByProduct, Pair<ISubTagContainer, Integer>... contents) {
- this(rgba, defaultName, toolTip, stats, type, generationFeatures, mID, texSet, contents);
- this.mOreByProducts.clear();
- this.mOreByProducts.addAll(oreByProduct);
- }
-
- @SafeVarargs
- public Werkstoff(short[] rgba, String defaultName, String toolTip, Werkstoff.Stats stats, Werkstoff.Types type,
- Werkstoff.GenerationFeatures generationFeatures, int mID, TextureSet texSet,
- Pair<ISubTagContainer, Integer>... contents) {
-
- if (Werkstoff.idHashSet.contains((short) mID))
- throw new UnsupportedOperationException("ID (" + mID + ") is already in use!");
- Werkstoff.idHashSet.add((short) mID);
- if (type == null) type = Werkstoff.Types.UNDEFINED;
-
- this.mID = (short) mID;
- this.defaultName = defaultName;
- // Ensure that localization key are written to the lang file
- GregTech_API.sAfterGTPreload.add(() -> { this.getLocalizedName(); });
- this.stats = stats;
- this.type = type;
- this.generationFeatures = generationFeatures;
- this.setRgb(BW_ColorUtil.correctCorlorArray(rgba));
- this.CONTENTS.addAll(Arrays.asList(contents));
- this.toolTip = "";
- if (toolTip.isEmpty()) {
- for (Pair<ISubTagContainer, Integer> p : contents) {
- if (contents.length > 1) {
- if (p.getKey() instanceof Materials) {
- if (((Materials) p.getKey()).mMaterialList.size() > 1 && p.getValue() > 1)
- this.toolTip += "(" + getFormula((Materials) p.getKey())
- + ")"
- + BW_Util.subscriptNumber(p.getValue());
- else this.toolTip += getFormula((Materials) p.getKey())
- + (p.getValue() > 1 ? BW_Util.subscriptNumber(p.getValue()) : "");
- }
- if (p.getKey() instanceof Werkstoff) {
- if (((Werkstoff) p.getKey()).CONTENTS.size() > 1 && p.getValue() > 1)
- this.toolTip += "(" + getFormula((Werkstoff) p.getKey())
- + ")"
- + BW_Util.subscriptNumber(p.getValue());
- else this.toolTip += getFormula((Werkstoff) p.getKey())
- + (p.getValue() > 1 ? BW_Util.subscriptNumber(p.getValue()) : "");
- }
- } else if (p.getKey() instanceof Materials) {
- this.toolTip += getFormula((Materials) p.getKey())
- + (p.getValue() > 1 ? BW_Util.subscriptNumber(p.getValue()) : "");
- } else if (p.getKey() instanceof Werkstoff) this.toolTip += getFormula((Werkstoff) p.getKey())
- + (p.getValue() > 1 ? BW_Util.subscriptNumber(p.getValue()) : "");
- }
- } else this.toolTip = toolTip;
-
- // if (this.toolTip.length() > 25)
- // this.toolTip = "The formula is to long...";
-
- // Ensure that localization key are written to the lang file
- GregTech_API.sAfterGTPreload.add(() -> { this.getLocalizedToolTip(); });
-
- if (this.stats.protons == 0) {
- long tmpprotons = 0;
- for (Pair<ISubTagContainer, Integer> p : contents) {
- if (p.getKey() instanceof Materials) {
- tmpprotons += ((Materials) p.getKey()).getProtons() * p.getValue();
- } else if (p.getKey() instanceof Werkstoff) {
- tmpprotons += ((Werkstoff) p.getKey()).getStats().protons * p.getValue();
- }
- }
- this.stats = stats.setProtons(tmpprotons);
- }
- if (this.stats.mass == 0) {
- long tmpmass = 0;
- int count = 0;
- for (Pair<ISubTagContainer, Integer> p : contents) {
- if (p.getKey() instanceof Materials) {
- tmpmass += ((Materials) p.getKey()).getMass() * p.getValue();
- count += p.getValue();
- } else if (p.getKey() instanceof Werkstoff) {
- tmpmass += ((Werkstoff) p.getKey()).getStats().mass * p.getValue();
- count += p.getValue();
- }
- }
- if (count > 0) this.stats = stats.setMass(tmpmass / count);
- }
-
- if (this.stats.meltingPoint == 0) this.stats.meltingPoint = 1123;
-
- if (this.stats.meltingVoltage == 0) this.stats.meltingVoltage = 120;
-
- this.texSet = texSet;
-
- switch (this.mOreByProducts.size()) {
- case 0:
- this.mOreByProducts.add(this);
- this.mOreByProducts.add(this);
- this.mOreByProducts.add(this);
- break;
- case 1:
- this.mOreByProducts.add(this);
- this.mOreByProducts.add(this);
- break;
- case 2:
- this.mOreByProducts.add(this);
- break;
- }
-
- Optional<Pair<ISubTagContainer, Integer>> firstContent;
- if (this.CONTENTS.size() == 1 && (firstContent = this.CONTENTS.stream()
- .findFirst()).isPresent()) {
- ISubTagContainer firstContentSubTagContainer = firstContent.get()
- .getKey();
- if (firstContent.get()
- .getValue() == 1 && firstContentSubTagContainer instanceof Materials) this.getGenerationFeatures()
- .setExtension();
- }
-
- Werkstoff.werkstoffHashSet.add(this);
- Werkstoff.werkstoffHashMap.put(this.mID, this);
- Werkstoff.werkstoffNameHashMap.put(this.defaultName, this);
-
- this.owner = this.getMaterialOwner();
- }
-
- private static String getFormula(Materials material) {
- return material.mChemicalFormula.isEmpty() ? "?" : material.mChemicalFormula;
- }
-
- private static String getFormula(Werkstoff material) {
- return material.toolTip.isEmpty() ? "?" : material.toolTip;
- }
-
- public Werkstoff addAdditionalOreDict(String s) {
- this.ADDITIONAL_OREDICT.add(s);
- return this;
- }
-
- public HashSet<String> getADDITIONAL_OREDICT() {
- return this.ADDITIONAL_OREDICT;
- }
-
- public void setTCAspects(Pair<Object, Integer>... pAspectsArr) {
- this.stats.mTC_Aspects = pAspectsArr;
- }
-
- @SuppressWarnings("unchecked")
- public Pair<Object, Integer>[] getTCAspects(int ratio) {
- if (this.stats.mTC_Aspects == null) {
- HashSet<TC_Aspects.TC_AspectStack> tc_aspectStacks = new HashSet<>();
- HashSet<Pair<Object, Integer>> set = new HashSet<>();
- for (Pair<?, ?> p : this.getContents()
- .getValue()) {
- if (p.getKey() instanceof Materials) tc_aspectStacks.addAll(((Materials) p.getKey()).mAspects);
- if (p.getKey() instanceof Werkstoff) set.addAll(Arrays.asList(((Werkstoff) p.getKey()).getTCAspects()));
- }
- tc_aspectStacks.forEach(
- tc_aspectStack -> set.add(new Pair<>(tc_aspectStack.mAspect.mAspect, (int) tc_aspectStack.mAmount)));
- this.stats.mTC_Aspects = set.toArray(new Pair[0]);
- }
- Pair<Object, Integer>[] ret = this.stats.mTC_Aspects.clone();
- for (int i = 0; i < ret.length; i++) {
- ret[i] = ret[i].copyWithNewValue(ret[i].getValue() * ratio);
- }
- return ret;
- }
-
- public List<TC_Aspects.TC_AspectStack> getGTWrappedTCAspects() {
- final List<TC_Aspects.TC_AspectStack> ret = new ArrayList<>();
- Arrays.stream(this.getTCAspects())
- .forEach(objectIntegerPair -> {
- try {
- new TC_Aspects.TC_AspectStack(
- TC_Aspects.valueOf(
- ((String) ThaumcraftHandler.AspectAdder.getName.invoke(objectIntegerPair.getKey()))
- .toUpperCase(Locale.US)),
- objectIntegerPair.getValue()).addToAspectList(ret);
- } catch (IllegalAccessException | InvocationTargetException ignored) {}
- });
- return ret;
- }
-
- public Pair<Object, Integer>[] getTCAspects() {
- return this.getTCAspects(1);
- }
-
- public Werkstoff.Types getType() {
- return this.type;
- }
-
- public boolean containsStuff(ISubTagContainer stuff) {
- for (Pair<ISubTagContainer, Integer> pair : this.CONTENTS) {
- if (pair.getKey()
- .equals(stuff)) return true;
- }
- return false;
- }
-
- public Pair<Integer, LinkedHashSet<Pair<ISubTagContainer, Integer>>> getContents() {
- int ret = 0;
- switch (this.type) {
- case COMPOUND:
- case MIXTURE:
- case BIOLOGICAL: {
- for (int i = 0; i < this.CONTENTS.toArray().length; i++) {
- ret += (int) this.CONTENTS.toArray(new Pair[0])[i].getValue();
- }
- break;
- }
- default:
- ret = 1;
- break;
- }
- return new Pair<>(ret, this.CONTENTS);
- }
-
- public int getNoOfByProducts() {
- return this.mOreByProducts.size();
- }
-
- public ISubTagContainer getOreByProductRaw(int aNumber) {
- if (this.mOreByProducts.size() == 0) return null;
- if (aNumber < 0) aNumber = this.mOreByProducts.size() + aNumber;
- while (aNumber >= this.mOreByProducts.size()) aNumber--;
- ISubTagContainer o = this.mOreByProducts.get(aNumber);
- if (o == null || o.equals(Werkstoff.default_null_Werkstoff) || o.equals(Materials._NULL)) return this;
- return o;
- }
-
- public ItemStack getOreByProduct(int aNumber, OrePrefixes prefixes) {
- if (this.mOreByProducts.size() == 0) return null;
- if (aNumber < 0) aNumber = this.mOreByProducts.size() + aNumber;
- while (aNumber >= this.mOreByProducts.size()) aNumber--;
- Object o = this.mOreByProducts.get(aNumber);
- if (o == null || o.equals(Werkstoff.default_null_Werkstoff) || o.equals(Materials._NULL))
- return this.get(prefixes);
- if (o instanceof Werkstoff) return WerkstoffLoader.getCorrespondingItemStack(prefixes, (Werkstoff) o);
- if (o instanceof Materials) return GT_OreDictUnificator.get(prefixes, o, 1L);
- return null;
- }
-
- public String getDefaultName() {
- return this.defaultName;
- }
-
- public String getLocalizedName() {
- return GT_LanguageManager.addStringLocalization(
- String.format("bw.werkstoff.%05d.name", this.mID),
- this.defaultName,
- !GregTech_API.sPostloadFinished);
- }
-
- public String getVarName() {
- return this.defaultName.replace(" ", "");
- }
-
- public String getToolTip() {
- return this.toolTip;
- }
-
- public String getLocalizedToolTip() {
- return GT_LanguageManager.addStringLocalization(
- String.format("bw.werkstoff.%05d.tooltip", this.mID),
- this.toolTip,
- !GregTech_API.sPostloadFinished);
- }
-
- public Werkstoff.Stats getStats() {
- return this.stats;
- }
-
- public short getmID() {
- return this.mID;
- }
-
- public short getMixCircuit() {
- return this.getGenerationFeatures().mixCircuit;
- }
-
- public Werkstoff.GenerationFeatures getGenerationFeatures() {
- return this.generationFeatures;
- }
-
- public TextureSet getTexSet() {
- return this.texSet;
- }
-
- public void setRgb(short[] rgb) {
- this.rgb = new byte[] { (byte) (rgb[0] - 128), (byte) (rgb[1] - 128), (byte) (rgb[2] - 128) };
- }
-
- @Override
- public short[] getRGBA() {
- return new short[] { (short) (this.rgb[0] + 128), (short) (this.rgb[1] + 128), (short) (this.rgb[2] + 128), 0 };
- }
-
- @Override
- public boolean contains(SubTag subTag) {
- if (!subTag.equals(WerkstoffLoader.NOBLE_GAS) && !subTag.equals(WerkstoffLoader.ANAEROBE_GAS)
- && !subTag.equals(WerkstoffLoader.NO_BLAST))
- for (Pair<ISubTagContainer, Integer> p : this.CONTENTS) if (p.getKey()
- .contains(subTag)) return true;
- return this.SUBTAGS.contains(subTag);
- }
-
- @Override
- public ISubTagContainer add(SubTag... subTags) {
- this.SUBTAGS.addAll(Arrays.asList(subTags));
- return this;
- }
-
- @Override
- public boolean remove(SubTag subTag) {
- return this.SUBTAGS.remove(subTag);
- }
-
- public void getAndAddToCollection(OrePrefixes prefixes, int amount, Collection<ItemStack> stacks) {
- stacks.add(this.get(prefixes, amount));
- }
-
- public ItemStack get(OrePrefixes prefixes) {
- return WerkstoffLoader.getCorrespondingItemStack(prefixes, this);
- }
-
- public FluidStack getFluidOrGas(int fluidAmount) {
- return new FluidStack(Objects.requireNonNull(WerkstoffLoader.fluids.get(this)), fluidAmount);
- }
-
- public FluidStack getMolten(int fluidAmount) {
- return new FluidStack(Objects.requireNonNull(WerkstoffLoader.molten.get(this)), fluidAmount);
- }
-
- public ItemStack get(OrePrefixes prefixes, int amount) {
- return WerkstoffLoader.getCorrespondingItemStack(prefixes, this, amount);
- }
-
- public byte getToolQuality() {
- return this.stats.getQualityOverride() > 0 ? this.stats.getQualityOverride()
- : (byte) (15f * (this.getStats()
- .getProtons() / 188f
- + this.getStats()
- .getMeltingPoint() / 10801f)
- / (float) this.getContents()
- .getKey());
- }
-
- public float getToolSpeed() {
- return this.stats.getSpeedOverride() > 0f ? this.stats.getSpeedOverride()
- : Math.max(
- 1f,
- 2f * (-this.getStats()
- .getMass() + 0.1f
- * this.getStats()
- .getMeltingPoint()
- + this.getStats()
- .getProtons())
- * 0.1f
- / (float) this.getContents()
- .getKey()
- * 0.1f
- * this.getToolQuality());
- }
-
- public int getDurability() {
- return this.stats.getDurOverride() > 0 ? this.stats.getDurOverride()
- : (int) (this.stats.durMod * (0.01f * this.getStats()
- .getMeltingPoint()
- * this.getStats()
- .getMass()
- / (float) this.getContents()
- .getKey()));
- }
-
- /**
- * Checks if the generation feature is enabled and if its not in the blacklist
- */
- public boolean hasItemType(OrePrefixes prefixes) {
- int unpacked = Werkstoff.GenerationFeatures.getPrefixDataRaw(prefixes);
- return (this.getGenerationFeatures().toGenerate & unpacked) != 0
- && (this.getGenerationFeatures().blacklist & unpacked) == 0;
- }
-
- /**
- * DOES NOT CHECK BLACKLIST!
- */
- public boolean hasGenerationFeature(OrePrefixes prefixes) {
- int unpacked = Werkstoff.GenerationFeatures.getPrefixDataRaw(prefixes);
- return (this.getGenerationFeatures().toGenerate & unpacked) != 0;
- }
-
- /**
- * Checks if the Actual Stack exists in the OreDict
- */
- public boolean doesOreDictedItemExists(OrePrefixes prefixes) {
- return OreDictHandler.getItemStack(this.getDefaultName(), prefixes, 1) != null;
- }
-
- public String getOwner() {
- return this.owner;
- }
-
- private String getMaterialOwner() {
- String modName = Loader.instance()
- .activeModContainer()
- .getName();
- if (modNameOverrides.get(modName) != null) {
- return modNameOverrides.get(modName);
- }
- if (BWModNames.contains(modName)) {
- return null;
- }
- return GREEN + modName;
- }
-
- public enum Types {
-
- MATERIAL,
- COMPOUND,
- MIXTURE,
- BIOLOGICAL,
- ELEMENT,
- ISOTOPE,
- UNDEFINED;
-
- public static Werkstoff.Stats getDefaultStatForType(Werkstoff.Types T) {
- return switch (T) {
- case COMPOUND, BIOLOGICAL -> new Werkstoff.Stats().setElektrolysis(true);
- case MIXTURE -> new Werkstoff.Stats().setCentrifuge(true);
- default -> new Werkstoff.Stats();
- };
- }
- }
-
- public static class GenerationFeatures {
-
- public static final GenerationFeatures DISABLED = new GenerationFeatures().disable();
- long toGenerate = 0b0001001;
- // logic gate shit
- /*
- * dust 1 metal 10 (ingot, nugget) gem 100 ore 1000 cell 10000 plasma 100000 molten 1000000 crafting metal
- * 10000000 (sticks, plates) meta crafting metal 100000000 (gears, screws, bolts, springs) multiple ingotWorth
- * stuff 1000000000 (double, triple, quadruple, ingot/plates)
- */
- private boolean isExtension;
- private static final NonNullWrappedHashMap<OrePrefixes, Integer> prefixLogic = new NonNullWrappedHashMap<>(0);
-
- public GenerationFeatures() {}
-
- public static void initPrefixLogic() {
- Arrays.stream(OrePrefixes.values())
- .forEach(e -> prefixLogic.put(e, 0));
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.dust, 0b1);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.dustTiny, 0b1);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.dustSmall, 0b1);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ingot, 0b10);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ingotHot, 0b10);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.nugget, 0b10);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gem, 0b100);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gemFlawed, 0b100);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gemExquisite, 0b100);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gemChipped, 0b100);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gemFlawless, 0b100);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.lens, 0b100);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.block, 0b110);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ore, 0b1000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.dustImpure, 0b1000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.dustPure, 0b1000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.crushed, 0b1000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.crushedPurified, 0b1000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.crushedCentrifuged, 0b1000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.rawOre, 0b1000);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.cell, 0b10000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.capsule, 0b10000);
- // Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.bottle,0b10000);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.capsuleMolten, 0b1000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.cellMolten, 0b1000000);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.plate, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.foil, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.stick, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.stickLong, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.toolHeadHammer, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.toolHeadWrench, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.toolHeadSaw, 0b10000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.turbineBlade, 0b10000000);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.screw, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gearGt, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.gearGtSmall, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.bolt, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ring, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.spring, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.springSmall, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.rotor, 0b100000000);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.wireFine, 0b100000000);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.plateDouble, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.plateTriple, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.plateQuadruple, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.plateQuintuple, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.plateDense, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ingotDouble, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ingotTriple, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ingotQuadruple, 0x200);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.ingotQuintuple, 0x200);
-
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.blockCasing, 0x380);
- Werkstoff.GenerationFeatures.prefixLogic.put(OrePrefixes.blockCasingAdvanced, 0x380);
- }
-
- public void setExtension() {
- this.isExtension = !this.isExtension;
- }
-
- public static int getPrefixDataRaw(OrePrefixes prefixes) {
- if (prefixes == null) throw new IllegalArgumentException("OrePrefixes is NULL!");
- return GenerationFeatures.prefixLogic.get(prefixes);
- }
-
- public boolean isExtension() {
- return this.isExtension;
- }
-
- // public byte toGenerateSecondary = 0b0000000;
- public byte blacklist;
-
- public boolean enforceUnification;
-
- /*
- * Auto add Chemical Recipes 1 Auto add mixer Recipes 10 Auto add Sifter Recipe 100 Auto add
- * MetalWorking(sticks, plates) Recipe 1000 Auto add MetalWorking(crafting components) Recipe 10000
- */
- public byte extraRecipes;
-
- /*
- * Here so that new recipes don't fuck with existing functionality Auto add Crafting Metal Solidifier recipes 1
- * Auto add Meta Crafting Metal Solidifier recipes 10 Auto add Multiple Ingot Metal Solidifier recipes 100
- * (Unused)
- */
- public byte extraRecipes2;
-
- public short mixCircuit = -1;
-
- public Werkstoff.GenerationFeatures setBlacklist(OrePrefixes p) {
- this.blacklist |= getPrefixDataRaw(p);
- return this;
- }
-
- @Deprecated
- public boolean hasDusts() {
- return (this.toGenerate & 0b1) != 0;
- }
-
- @Deprecated
- public boolean hasGems() {
- return (this.toGenerate & 0b100) != 0;
- }
-
- @Deprecated
- public boolean hasOres() {
- return (this.toGenerate & 0b1000) != 0;
- }
-
- public Werkstoff.GenerationFeatures enforceUnification() {
- this.enforceUnification = true;
- return this;
- }
-
- @Deprecated
- public Werkstoff.GenerationFeatures removeGems() {
- if (this.hasGems()) this.toGenerate = this.toGenerate ^ 0b100;
- return this;
- }
-
- @Deprecated
- public Werkstoff.GenerationFeatures removeDusts() {
- if (this.hasDusts()) this.toGenerate = this.toGenerate ^ 0b1;
- return this;
- }
-
- @Deprecated
- public Werkstoff.GenerationFeatures removeOres() {
- if (this.hasOres()) this.toGenerate = this.toGenerate ^ 0b1000;
- return this;
- }
-
- public Werkstoff.GenerationFeatures addChemicalRecipes() {
- this.extraRecipes = (byte) (this.extraRecipes | 1);
- return this;
- }
-
- public boolean hasChemicalRecipes() {
- return (this.extraRecipes & 1) != 0;
- }
-
- public Werkstoff.GenerationFeatures addMetalCraftingSolidifierRecipes() {
- this.extraRecipes2 = (byte) (this.extraRecipes2 | 1);
- return this;
- }
-
- public boolean hasMetalCraftingSolidifierRecipes() {
- return (this.extraRecipes2 & 1) != 0;
- }
-
- public Werkstoff.GenerationFeatures addMetaSolidifierRecipes() {
- this.extraRecipes2 = (byte) (this.extraRecipes2 | 10);
- return this;
- }
-
- public boolean hasMetaSolidifierRecipes() {
- return (this.extraRecipes2 & 10) != 0;
- }
-
- public Werkstoff.GenerationFeatures addMultipleMetalSolidifierRecipes() {
- this.extraRecipes2 = (byte) (this.extraRecipes2 | 100);
- return this;
- }
-
- public boolean hasMultipleMetalSolidifierRecipes() {
- return (this.extraRecipes2 & 100) != 0;
- }
-
- public Werkstoff.GenerationFeatures addMixerRecipes() {
- this.extraRecipes = (byte) (this.extraRecipes | 10);
- return this;
- }
-
- public Werkstoff.GenerationFeatures addMixerRecipes(short aCircuit) {
- this.extraRecipes = (byte) (this.extraRecipes | 10);
- if (aCircuit >= 1 && aCircuit <= 24) this.mixCircuit = aCircuit;
- return this;
- }
-
- public boolean hasMixerRecipes() {
- return (this.extraRecipes & 10) != 0;
- }
-
- public Werkstoff.GenerationFeatures addSifterRecipes() {
- this.extraRecipes = (byte) (this.extraRecipes | 100);
- return this;
- }
-
- public boolean hasSifterRecipes() {
- return (this.extraRecipes & 100) != 0;
- }
-
- public Werkstoff.GenerationFeatures onlyDust() {
- this.toGenerate = 0b1;
- return this;
- }
-
- /**
- * Automatically adds Simple Metal Working Items
- */
- public Werkstoff.GenerationFeatures addMetalItems() {
- this.toGenerate = this.addSimpleMetalWorkingItems().toGenerate | 0b10;
- return this;
- }
-
- public Werkstoff.GenerationFeatures disable() {
- this.toGenerate = 0;
- return this;
- }
-
- public Werkstoff.GenerationFeatures addCells() {
- this.toGenerate = this.toGenerate | 0b10000;
- return this;
- }
-
- @Deprecated
- public boolean hasCells() {
- return (this.toGenerate & 0b10000) != 0;
- }
-
- @Deprecated
- public boolean hasMolten() {
- return (this.toGenerate & 0b1000000) != 0;
- }
-
- public Werkstoff.GenerationFeatures addMolten() {
- this.toGenerate = this.toGenerate | 0b1000000;
- return this;
- }
-
- /**
- * Automatically adds Simple Metal Working Items
- */
- public Werkstoff.GenerationFeatures addGems() {
- this.toGenerate = this.addSimpleMetalWorkingItems().toGenerate | 0x4;
- return this;
- }
-
- public Werkstoff.GenerationFeatures addSimpleMetalWorkingItems() {
- this.toGenerate = this.toGenerate | 0b10000000;
- return this;
- }
-
- public Werkstoff.GenerationFeatures addCasings() {
- this.toGenerate = this.toGenerate | 0x382;
- return this;
- }
-
- @Deprecated
- public boolean hasSimpleMetalWorkingItems() {
- return (this.toGenerate & 0b10000000) != 0;
- }
-
- public Werkstoff.GenerationFeatures addCraftingMetalWorkingItems() {
- this.toGenerate = this.toGenerate | 0x100;
- return this;
- }
-
- public Werkstoff.GenerationFeatures addMultipleIngotMetalWorkingItems() {
- this.toGenerate = this.toGenerate | 0x200;
- return this;
- }
-
- public Werkstoff.GenerationFeatures addPrefix(OrePrefixes prefixes) {
- this.toGenerate = this.toGenerate | getPrefixDataRaw(prefixes);
- return this;
- }
-
- public Werkstoff.GenerationFeatures removePrefix(OrePrefixes prefixes) {
- this.toGenerate = this.toGenerate ^ getPrefixDataRaw(prefixes);
- return this;
- }
- }
-
- public static class Stats {
-
- public static final int NULL_KELVIN = 0;
-
- int boilingPoint;
-
- public int getBoilingPoint() {
- return this.boilingPoint;
- }
-
- public Werkstoff.Stats setBoilingPoint(int boilingPoint) {
- this.boilingPoint = boilingPoint;
- return this;
- }
-
- public long getMass() {
- return this.mass;
- }
-
- public long getProtons() {
- return this.protons;
- }
-
- public int getMeltingPoint() {
- return this.meltingPoint;
- }
-
- public Werkstoff.Stats setMeltingPoint(int meltingPoint) {
- this.meltingPoint = meltingPoint;
- return this;
- }
-
- public double getEbfGasRecipeTimeMultiplier() {
- return this.ebfGasRecipeTimeMultiplier;
- }
-
- /**
- * The generated EBF recipes using this gas will have their duration multiplied by this number. If set to a
- * negative value, the default proton count-based logic is used. For GT Materials gases, add the overrides to
- * {@link StaticRecipeChangeLoaders#addEBFGasRecipes()}
- */
- public Werkstoff.Stats setEbfGasRecipeTimeMultiplier(double timeMultiplier) {
- this.ebfGasRecipeTimeMultiplier = timeMultiplier;
- return this;
- }
-
- public double getEbfGasRecipeConsumedAmountMultiplier() {
- return this.ebfGasRecipeConsumedAmountMultiplier;
- }
-
- /**
- * The generated EBF recipes using this gas will have the amount of gas consumed multiplied by this number. For
- * GT Materials gases, add the overrides to {@link StaticRecipeChangeLoaders#addEBFGasRecipes()}
- */
- public Werkstoff.Stats setEbfGasRecipeConsumedAmountMultiplier(double amountMultiplier) {
- this.ebfGasRecipeConsumedAmountMultiplier = amountMultiplier;
- return this;
- }
-
- public int getDurOverride() {
- return this.durOverride;
- }
-
- public Werkstoff.Stats setDurOverride(int durOverride) {
- this.durOverride = durOverride;
- return this;
- }
-
- public float getSpeedOverride() {
- return this.speedOverride;
- }
-
- public Werkstoff.Stats setSpeedOverride(float speedOverride) {
- this.speedOverride = speedOverride;
- return this;
- }
-
- public byte getQualityOverride() {
- return this.qualityOverride;
- }
-
- public Werkstoff.Stats setQualityOverride(byte qualityOverride) {
- this.qualityOverride = qualityOverride;
- return this;
- }
-
- private byte qualityOverride;
- private int durOverride;
- private float speedOverride;
- private int meltingPoint;
- private int meltingVoltage;
- private long protons;
- private long neutrons;
- private long electrons;
- private long mass;
- private double ebfGasRecipeTimeMultiplier = -1.0;
- private double ebfGasRecipeConsumedAmountMultiplier = 1.0;
-
- float durMod = 1f;
-
- public float getDurMod() {
- return this.durMod;
- }
-
- public void setDurMod(float durMod) {
- this.durMod = durMod;
- }
-
- private Pair<Object, Integer>[] mTC_Aspects;
- // logic gate shit
- byte quality = ~0b1111111;
-
- public Werkstoff.Stats setmTC_AspectsArray(Pair<Object, Integer>[] mTC_Aspects) {
- this.mTC_Aspects = mTC_Aspects;
- return this;
- }
-
- @SafeVarargs
- public final Werkstoff.Stats setmTC_AspectsVarArg(Pair<Object, Integer>... mTC_Aspects) {
- this.mTC_Aspects = mTC_Aspects;
- return this;
- }
-
- Pair<Object, Integer>[] getmTC_Aspects() {
- return this.mTC_Aspects;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof Werkstoff.Stats that)) return false;
-
- if (this.boilingPoint != that.boilingPoint || this.meltingPoint != that.meltingPoint
- || this.mass != that.mass
- || this.protons != that.protons) return false;
- if (this.neutrons != that.neutrons) return false;
- if (this.electrons != that.electrons) return false;
- if (Math.abs(this.ebfGasRecipeTimeMultiplier - that.ebfGasRecipeTimeMultiplier) > 1.0e-6D) return false;
- if (Math.abs(this.ebfGasRecipeConsumedAmountMultiplier - that.ebfGasRecipeConsumedAmountMultiplier)
- > 1.0e-6D) return false;
- return this.quality == that.quality;
- }
-
- @Override
- public int hashCode() {
- return MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(49)
- .put(this.quality)
- .putInt(this.boilingPoint)
- .putInt(this.meltingPoint)
- .putLong(this.protons)
- .putLong(this.neutrons)
- .putLong(this.electrons)
- .putLong(this.mass)
- .putDouble(this.ebfGasRecipeTimeMultiplier)
- .putDouble(this.ebfGasRecipeConsumedAmountMultiplier)
- .array(),
- 0,
- 49,
- 31);
- }
-
- public Werkstoff.Stats setMass(long mass) {
- this.mass = mass;
- return this;
- }
-
- public Werkstoff.Stats setProtons(long protons) {
- this.protons = protons;
- return this;
- }
-
- public boolean isSublimation() {
- return (this.quality & 0b1) != 0;
- }
-
- public Werkstoff.Stats setSublimation(boolean sublimation) {
- if (sublimation) this.quality = (byte) (this.quality | 0b000001);
- else this.quality = (byte) (this.quality & 0b1111110);
- return this;
- }
-
- public boolean isToxic() {
- return (this.quality & 0b10) != 0;
- }
-
- public Werkstoff.Stats setToxic(boolean toxic) {
- if (toxic) this.quality = (byte) (this.quality | 0b000010);
- else this.quality = (byte) (this.quality & 0b1111101);
- return this;
- }
-
- byte enchantmentlvl = 3;
-
- public byte getEnchantmentlvl() {
- return this.enchantmentlvl;
- }
-
- public Werkstoff.Stats setEnchantmentlvl(byte enchantmentlvl) {
- this.enchantmentlvl = enchantmentlvl;
- return this;
- }
-
- public boolean isRadioactive() {
- return (this.quality & 0b100) != 0;
- }
-
- public Werkstoff.Stats setRadioactive(boolean radioactive) {
- if (radioactive) this.quality = (byte) (this.quality | 0b000100);
- else this.quality = (byte) (this.quality & 0b1111011);
- return this;
- }
-
- public boolean isBlastFurnace() {
- return (this.quality & 0b1000) != 0;
- }
-
- public Werkstoff.Stats setBlastFurnace(boolean blastFurnace) {
- if (blastFurnace) this.quality = (byte) (this.quality | 0b001000);
- else this.quality = (byte) (this.quality & 0b1110111);
- return this;
- }
-
- public Werkstoff.Stats setMeltingVoltage(int meltingVoltage) {
- this.meltingVoltage = meltingVoltage;
- return this;
- }
-
- public int getMeltingVoltage() {
- return this.meltingVoltage;
- }
-
- public boolean isElektrolysis() {
- return (this.quality & 0x10) != 0;
- }
-
- public Werkstoff.Stats setElektrolysis(boolean elektrolysis) {
- if (elektrolysis) this.quality = (byte) (this.quality | 0x10);
- else this.quality = (byte) (this.quality & 0b1101111);
- return this;
- }
-
- public boolean isCentrifuge() {
- return (this.quality & 0x20) != 0;
- }
-
- public Werkstoff.Stats setCentrifuge(boolean centrifuge) {
- if (centrifuge) this.quality = (byte) (this.quality | 0x20);
- else this.quality = (byte) (this.quality & 0b1011111);
- return this;
- }
-
- public boolean isGas() {
- return (this.quality & 0x40) != 0;
- }
-
- public FluidState getFluidState() {
- if ((this.quality & 0x40) != 0) {
- return FluidState.GAS;
- }
- return FluidState.LIQUID;
- }
-
- public Werkstoff.Stats setGas(boolean gas) {
- if (gas) this.quality = (byte) (this.quality | 0x40);
- else this.quality = (byte) (this.quality & 0b0111111);
- return this;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java
deleted file mode 100644
index 197ada7f22..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java
+++ /dev/null
@@ -1,2092 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.subscriptNumbers;
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.superscriptNumbers;
-import static gregtech.api.enums.Mods.BetterLoadingScreen;
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.bolt;
-import static gregtech.api.enums.OrePrefixes.bottle;
-import static gregtech.api.enums.OrePrefixes.capsule;
-import static gregtech.api.enums.OrePrefixes.cell;
-import static gregtech.api.enums.OrePrefixes.cellPlasma;
-import static gregtech.api.enums.OrePrefixes.crushed;
-import static gregtech.api.enums.OrePrefixes.crushedCentrifuged;
-import static gregtech.api.enums.OrePrefixes.crushedPurified;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustImpure;
-import static gregtech.api.enums.OrePrefixes.dustPure;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.dustTiny;
-import static gregtech.api.enums.OrePrefixes.foil;
-import static gregtech.api.enums.OrePrefixes.gearGt;
-import static gregtech.api.enums.OrePrefixes.gearGtSmall;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.gemChipped;
-import static gregtech.api.enums.OrePrefixes.gemExquisite;
-import static gregtech.api.enums.OrePrefixes.gemFlawed;
-import static gregtech.api.enums.OrePrefixes.gemFlawless;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.ingotDouble;
-import static gregtech.api.enums.OrePrefixes.ingotHot;
-import static gregtech.api.enums.OrePrefixes.ingotQuadruple;
-import static gregtech.api.enums.OrePrefixes.ingotQuintuple;
-import static gregtech.api.enums.OrePrefixes.ingotTriple;
-import static gregtech.api.enums.OrePrefixes.lens;
-import static gregtech.api.enums.OrePrefixes.nugget;
-import static gregtech.api.enums.OrePrefixes.ore;
-import static gregtech.api.enums.OrePrefixes.oreSmall;
-import static gregtech.api.enums.OrePrefixes.plate;
-import static gregtech.api.enums.OrePrefixes.plateDense;
-import static gregtech.api.enums.OrePrefixes.plateDouble;
-import static gregtech.api.enums.OrePrefixes.plateQuadruple;
-import static gregtech.api.enums.OrePrefixes.plateQuintuple;
-import static gregtech.api.enums.OrePrefixes.plateTriple;
-import static gregtech.api.enums.OrePrefixes.rawOre;
-import static gregtech.api.enums.OrePrefixes.ring;
-import static gregtech.api.enums.OrePrefixes.rotor;
-import static gregtech.api.enums.OrePrefixes.screw;
-import static gregtech.api.enums.OrePrefixes.spring;
-import static gregtech.api.enums.OrePrefixes.springSmall;
-import static gregtech.api.enums.OrePrefixes.stick;
-import static gregtech.api.enums.OrePrefixes.stickLong;
-import static gregtech.api.enums.OrePrefixes.toolHeadHammer;
-import static gregtech.api.enums.OrePrefixes.toolHeadSaw;
-import static gregtech.api.enums.OrePrefixes.toolHeadWrench;
-import static gregtech.api.enums.OrePrefixes.turbineBlade;
-import static gregtech.api.enums.OrePrefixes.values;
-import static gregtech.api.enums.OrePrefixes.wireFine;
-
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collections;
-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.block.material.Material;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.oredict.OreDictionary;
-
-import org.apache.logging.log4j.Level;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.API.WerkstoffAdderRegistry;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.client.renderer.BW_Renderer_Block_Ores;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.BW_CircuitsLoader;
-import com.github.bartimaeusnek.bartworks.system.material.GT_Enhancement.GTMetaItemEnhancer;
-import com.github.bartimaeusnek.bartworks.system.material.processingLoaders.AdditionalRecipes;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.AspectLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.BlockLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.CasingLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.CellLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.CraftingMaterialLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.CrushedLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.DustLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.GemLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.MetalLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.MoltenCellLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.MultipleMetalLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.OreLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.RawOreLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.SimpleMetalLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe.ToolLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.registration.AssociationLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.registration.BridgeMaterialsLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.registration.CasingRegistrator;
-import com.github.bartimaeusnek.bartworks.system.oredict.OreDictHandler;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-import com.github.bartimaeusnek.bartworks.util.EnumUtils;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.bartworks.util.log.DebugLog;
-import com.github.bartimaeusnek.crossmod.cls.CLSCompat;
-import com.google.common.collect.HashBiMap;
-
-import cpw.mods.fml.common.ProgressManager;
-import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.enums.Element;
-import gregtech.api.enums.FluidState;
-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.fluid.GT_FluidFactory;
-import gregtech.api.interfaces.ISubTagContainer;
-import gregtech.api.util.GT_OreDictUnificator;
-import ic2.api.recipe.IRecipeInput;
-import ic2.api.recipe.RecipeInputOreDict;
-import ic2.api.recipe.RecipeOutput;
-import ic2.api.recipe.Recipes;
-
-@SuppressWarnings("deprecation")
-public class WerkstoffLoader {
-
- private WerkstoffLoader() {}
-
- public static final SubTag NOBLE_GAS = SubTag.getNewSubTag("NobleGas");
- public static final SubTag ANAEROBE_GAS = SubTag.getNewSubTag("AnaerobeGas");
- public static final SubTag ANAEROBE_SMELTING = SubTag.getNewSubTag("AnaerobeSmelting");
- public static final SubTag NOBLE_GAS_SMELTING = SubTag.getNewSubTag("NobleGasSmelting");
- public static final SubTag NO_BLAST = SubTag.getNewSubTag("NoBlast");
- public static ItemList rotorMold;
- public static ItemList rotorShape;
- public static ItemList smallGearShape;
- public static ItemList ringMold;
- public static ItemList boltMold;
-
- public static void setUp() {
-
- OrePrefixes.cellMolten.mMaterialGenerationBits = 0b1000000;
- OrePrefixes.capsuleMolten.mMaterialGenerationBits = 0b1000000;
-
- try {
- WerkstoffLoader.rotorMold = Enum.valueOf(ItemList.class, "Shape_Mold_Rotor");
- WerkstoffLoader.rotorShape = Enum.valueOf(ItemList.class, "Shape_Extruder_Rotor");
- WerkstoffLoader.smallGearShape = Enum.valueOf(ItemList.class, "Shape_Extruder_Small_Gear");
- WerkstoffLoader.ringMold = Enum.valueOf(ItemList.class, "Shape_Mold_Ring");
- WerkstoffLoader.boltMold = Enum.valueOf(ItemList.class, "Shape_Mold_Bolt");
- } catch (NullPointerException | IllegalArgumentException ignored) {}
-
- // add tiberium
- EnumUtils.createNewElement("Tr", 123L, 203L, 0L, -1L, null, "Tiberium", false);
-
- bottle.mDefaultStackSize = 1;
- Werkstoff.GenerationFeatures.initPrefixLogic();
- BW_GT_MaterialReference.init();
- }
-
- // TODO:
- // FREE ID RANGE: 12_000-28_998
- // bartimaeusnek reserved 0-10_000
- // GlodBlock reserved range 10_001-10_999
- // Elisis reserved range 11_000-11_499
- // glowredman reserved range 11_500-11_999
- // bot reserved range 29_899-29_999
- // Tec & basdxz reserved range 30_000-31_000
- // GT Material range reserved on 31_767-32_767
- public static final Werkstoff Bismutite = new Werkstoff(
- new short[] { 255, 233, 0, 0 },
- "Bismutite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 1,
- TextureSet.SET_FLINT,
- Collections.singletonList(Materials.Bismuth),
- new Pair<>(Materials.Bismuth, 2),
- new Pair<>(Materials.Oxygen, 2),
- new Pair<>(Materials.CarbonDioxide, 2));
- public static final Werkstoff Bismuthinit = new Werkstoff(
- new short[] { 192, 192, 192, 0 },
- "Bismuthinite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 2,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Bismuth, Materials.Sulfur),
- new Pair<>(Materials.Bismuth, 2),
- new Pair<>(Materials.Sulfur, 3));
- public static final Werkstoff Zirconium = new Werkstoff(
- new short[] { 175, 175, 175, 0 },
- "Zirconium",
- "Zr",
- new Werkstoff.Stats().setProtons(40)
- .setBlastFurnace(true)
- .setMeltingPoint(2130)
- .setMeltingVoltage(480),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMetalItems()
- .enforceUnification(),
- 3,
- TextureSet.SET_METALLIC
- // No Byproducts
- );
- public static final Werkstoff CubicZirconia = new Werkstoff(
- new short[] { 255, 255, 255, 0 },
- "Cubic Zirconia",
- Werkstoff.Types.COMPOUND,
- 3273,
- new Werkstoff.GenerationFeatures().onlyDust()
- .addGems()
- .enforceUnification(),
- 4,
- TextureSet.SET_DIAMOND,
- Collections.singletonList(WerkstoffLoader.Zirconium),
- new Pair<>(WerkstoffLoader.Zirconium, 1),
- new Pair<>(Materials.Oxygen, 2));
- public static final Werkstoff FluorBuergerit = new Werkstoff(
- new short[] { 0x20, 0x20, 0x20, 0 },
- "Fluor-Buergerite",
- subscriptNumbers("NaFe3Al6(Si6O18)(BO3)3O3F"),
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 5,
- TextureSet.SET_RUBY,
- Arrays.asList(Materials.Sodium, Materials.Boron, Materials.SiliconDioxide),
- new Pair<>(Materials.Sodium, 1),
- new Pair<>(Materials.Iron, 3),
- new Pair<>(Materials.Aluminium, 6),
- new Pair<>(Materials.Silicon, 6),
- new Pair<>(Materials.Boron, 3),
- new Pair<>(Materials.Oxygen, 30),
- new Pair<>(Materials.Fluorine, 1));
- public static final Werkstoff YttriumOxide = new Werkstoff(
- new short[] { 255, 255, 255, 0 },
- "Yttrium Oxide",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().onlyDust()
- .enforceUnification(), // No autoadd here to gate this material
- // by hand
- 6,
- TextureSet.SET_DULL,
- new Pair<>(Materials.Yttrium, 2),
- new Pair<>(Materials.Oxygen, 3));
- public static final Werkstoff ChromoAluminoPovondrait = new Werkstoff(
- new short[] { 0, 0x79, 0x6A, 0 },
- "Chromo-Alumino-Povondraite",
- subscriptNumbers("NaCr3(Al4Mg2)(Si6O18)(BO3)3(OH)3O"),
- Werkstoff.Types.getDefaultStatForType(Werkstoff.Types.COMPOUND)
- .setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 7,
- TextureSet.SET_RUBY,
- Arrays.asList(Materials.Sodium, Materials.Boron, Materials.SiliconDioxide),
- new Pair<>(Materials.Sodium, 1),
- new Pair<>(Materials.Chrome, 3),
- new Pair<>(Materials.Magnalium, 6),
- new Pair<>(Materials.Silicon, 6),
- new Pair<>(Materials.Boron, 3),
- new Pair<>(Materials.Oxygen, 31),
- new Pair<>(Materials.Hydrogen, 3));
- public static final Werkstoff VanadioOxyDravit = new Werkstoff(
- new short[] { 0x60, 0xA0, 0xA0, 0 },
- "Vanadio-Oxy-Dravite",
- subscriptNumbers("NaV3(Al4Mg2)(Si6O18)(BO3)3(OH)3O"),
- Werkstoff.Types.getDefaultStatForType(Werkstoff.Types.COMPOUND)
- .setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 8,
- TextureSet.SET_RUBY,
- Arrays.asList(Materials.Sodium, Materials.Boron, Materials.SiliconDioxide),
- new Pair<>(Materials.Sodium, 1),
- new Pair<>(Materials.Vanadium, 3),
- new Pair<>(Materials.Magnalium, 6),
- new Pair<>(Materials.Silicon, 6),
- new Pair<>(Materials.Boron, 3),
- new Pair<>(Materials.Oxygen, 31),
- new Pair<>(Materials.Hydrogen, 3));
- public static final Werkstoff Olenit = new Werkstoff(
- new short[] { 210, 210, 210, 0 },
- "Olenite",
- subscriptNumbers("NaAl3Al6(Si6O18)(BO3)3O3OH"),
- Werkstoff.Types.getDefaultStatForType(Werkstoff.Types.COMPOUND)
- .setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 9,
- TextureSet.SET_RUBY,
- Arrays.asList(Materials.Sodium, Materials.Boron, Materials.SiliconDioxide),
- new Pair<>(Materials.Sodium, 1),
- new Pair<>(Materials.Aluminium, 9),
- new Pair<>(Materials.Silicon, 6),
- new Pair<>(Materials.Boron, 3),
- new Pair<>(Materials.Oxygen, 31),
- new Pair<>(Materials.Hydrogen, 1));
- public static final Werkstoff Arsenopyrite = new Werkstoff(
- new short[] { 0xB0, 0xB0, 0xB0, 0 },
- "Arsenopyrite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 10,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Sulfur, Materials.Arsenic, Materials.Iron),
- new Pair<>(Materials.Iron, 1),
- new Pair<>(Materials.Arsenic, 1),
- new Pair<>(Materials.Sulfur, 1));
- public static final Werkstoff Ferberite = new Werkstoff(
- new short[] { 0xB0, 0xB0, 0xB0, 0 },
- "Ferberite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 11,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Iron, Materials.Tungsten),
- new Pair<>(Materials.Iron, 1),
- new Pair<>(Materials.Tungsten, 1),
- new Pair<>(Materials.Oxygen, 3));
- public static final Werkstoff Loellingit = new Werkstoff(
- new short[] { 0xD0, 0xD0, 0xD0, 0 },
- "Loellingite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 12,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Iron, Materials.Arsenic),
- new Pair<>(Materials.Iron, 1),
- new Pair<>(Materials.Arsenic, 2));
- public static final Werkstoff Roquesit = new Werkstoff(
- new short[] { 0xA0, 0xA0, 0xA0, 0 },
- "Roquesite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 13,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Copper, Materials.Sulfur),
- new Pair<>(Materials.Copper, 1),
- new Pair<>(Materials.Indium, 1),
- new Pair<>(Materials.Sulfur, 2));
- public static final Werkstoff Bornite = new Werkstoff(
- new short[] { 0x97, 0x66, 0x2B, 0 },
- "Bornite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 14,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Copper, Materials.Iron, Materials.Sulfur),
- new Pair<>(Materials.Copper, 5),
- new Pair<>(Materials.Iron, 1),
- new Pair<>(Materials.Sulfur, 4));
- public static final Werkstoff Wittichenit = new Werkstoff(
- Materials.Copper.mRGBa,
- "Wittichenite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 15,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Copper, Materials.Bismuth, Materials.Sulfur),
- new Pair<>(Materials.Copper, 5),
- new Pair<>(Materials.Bismuth, 1),
- new Pair<>(Materials.Sulfur, 4));
- public static final Werkstoff Djurleit = new Werkstoff(
- new short[] { 0x60, 0x60, 0x60, 0 },
- "Djurleite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 16,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Copper, Materials.Copper, Materials.Sulfur),
- new Pair<>(Materials.Copper, 31),
- new Pair<>(Materials.Sulfur, 16));
- public static final Werkstoff Huebnerit = new Werkstoff(
- new short[] { 0x80, 0x60, 0x60, 0 },
- "Huebnerite",
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 17,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Manganese, Materials.Tungsten),
- new Pair<>(Materials.Manganese, 1),
- new Pair<>(Materials.Tungsten, 1),
- new Pair<>(Materials.Oxygen, 3));
- public static final Werkstoff Thorianit = new Werkstoff(
- new short[] { 0x30, 0x30, 0x30, 0 },
- "Thorianite",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 18,
- TextureSet.SET_METALLIC,
- Collections.singletonList(Materials.Thorium),
- new Pair<>(Materials.Thorium, 1),
- new Pair<>(Materials.Oxygen, 2));
- public static final Werkstoff RedZircon = new Werkstoff(
- new short[] { 195, 19, 19, 0 },
- "Red Zircon",
- new Werkstoff.Stats().setElektrolysis(false)
- .setMeltingPoint(2130),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 19,
- TextureSet.SET_GEM_VERTICAL,
- Arrays.asList(WerkstoffLoader.Zirconium, Materials.SiliconDioxide),
- new Pair<>(WerkstoffLoader.Zirconium, 1),
- new Pair<>(Materials.Silicon, 1),
- new Pair<>(Materials.Oxygen, 4));
-
- // GT Enhancements
- public static final Werkstoff Salt = new Werkstoff(
- Materials.Salt.mRGBa,
- "Salt",
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addGems()
- .addSifterRecipes(),
- 20,
- TextureSet.SET_FLINT,
- Arrays.asList(Materials.RockSalt, Materials.Borax),
- new Pair<>(Materials.Salt, 1));
- public static final Werkstoff Spodumen = new Werkstoff(
- Materials.Spodumene.mRGBa,
- "Spodumene",
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addGems()
- .addSifterRecipes(),
- 21,
- TextureSet.SET_FLINT,
- Collections.singletonList(Materials.Spodumene),
- new Pair<>(Materials.Spodumene, 1));
- public static final Werkstoff RockSalt = new Werkstoff(
- Materials.RockSalt.mRGBa,
- "Rock Salt",
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addGems()
- .addSifterRecipes(),
- 22,
- TextureSet.SET_FLINT,
- Arrays.asList(Materials.RockSalt, Materials.Borax),
- new Pair<>(Materials.RockSalt, 1));
-
- // More NonGT Stuff
- public static final Werkstoff Fayalit = new Werkstoff(
- new short[] { 50, 50, 50, 0 },
- "Fayalite",
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 23,
- TextureSet.SET_QUARTZ,
- Arrays.asList(Materials.Iron, Materials.SiliconDioxide),
- new Pair<>(Materials.Iron, 2),
- new Pair<>(Materials.Silicon, 1),
- new Pair<>(Materials.Oxygen, 4));
- public static final Werkstoff Forsterit = new Werkstoff(
- new short[] { 255, 255, 255, 0 },
- "Forsterite",
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 24,
- TextureSet.SET_QUARTZ,
- Arrays.asList(Materials.Magnesium, Materials.SiliconDioxide),
- new Pair<>(Materials.Magnesium, 2),
- new Pair<>(Materials.Silicon, 1),
- new Pair<>(Materials.Oxygen, 4));
- public static final Werkstoff Hedenbergit = new Werkstoff(
- new short[] { 100, 150, 100, 0 },
- "Hedenbergite",
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 25,
- TextureSet.SET_QUARTZ,
- Arrays.asList(Materials.Iron, Materials.Calcium, Materials.SiliconDioxide),
- new Pair<>(Materials.Calcium, 1),
- new Pair<>(Materials.Iron, 1),
- new Pair<>(Materials.Silicon, 2),
- new Pair<>(Materials.Oxygen, 6));
- public static final Werkstoff DescloiziteZNVO4 = new Werkstoff(
- new short[] { 0xBF, 0x18, 0x0F, 0 },
- "Red Descloizite", // Pb(Zn,Cu)[OH|VO4
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 26,
- TextureSet.SET_QUARTZ,
- Arrays.asList(Materials.Lead, Materials.Copper, Materials.Vanadium),
- new Pair<>(Materials.Lead, 1),
- new Pair<>(Materials.Zinc, 1),
- new Pair<>(Materials.Vanadium, 1),
- new Pair<>(Materials.Oxygen, 4));
- public static final Werkstoff DescloiziteCUVO4 = new Werkstoff(
- new short[] { 0xf9, 0x6d, 0x18, 0 },
- "Orange Descloizite", // Pb(Zn,Cu)[OH|VO4
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 27,
- TextureSet.SET_QUARTZ,
- Arrays.asList(Materials.Lead, Materials.Zinc, Materials.Vanadium),
- new Pair<>(Materials.Lead, 1),
- new Pair<>(Materials.Copper, 1),
- new Pair<>(Materials.Vanadium, 1),
- new Pair<>(Materials.Oxygen, 4));
- public static final Werkstoff FuchsitAL = new Werkstoff(
- new short[] { 0x4D, 0x7F, 0x64, 0 },
- "Green Fuchsite",
- subscriptNumbers("KAl3Si3O10(OH)2"),
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 28,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Potassium, Materials.Aluminiumoxide, Materials.SiliconDioxide),
- new Pair<>(Materials.Potassium, 1),
- new Pair<>(Materials.Aluminium, 3),
- new Pair<>(Materials.Silicon, 3),
- new Pair<>(Materials.Oxygen, 12),
- new Pair<>(Materials.Hydrogen, 2));
-
- public static final Werkstoff FuchsitCR = new Werkstoff(
- new short[] { 128, 0, 0, 0 },
- "Red Fuchsite",
- subscriptNumbers("KCr3Si3O10(OH)2"),
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 29,
- TextureSet.SET_METALLIC,
- Arrays.asList(Materials.Potassium, Materials.Chrome, Materials.SiliconDioxide),
- new Pair<>(Materials.Potassium, 1),
- new Pair<>(Materials.Chrome, 3),
- new Pair<>(Materials.Silicon, 3),
- new Pair<>(Materials.Oxygen, 12),
- new Pair<>(Materials.Hydrogen, 2));
-
- public static final Werkstoff Thorium232 = new Werkstoff(
- new short[] { 0, 64, 0, 0 },
- "Thorium 232",
- superscriptNumbers("Th232"),
- new Werkstoff.Stats().setRadioactive(true)
- .setBlastFurnace(true)
- .setMass(232)
- .setProtons(Element.Th.mProtons),
- Werkstoff.Types.ISOTOPE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMetalItems()
- .enforceUnification(),
- 30,
- TextureSet.SET_METALLIC
- // No Byproducts
- );
- public static final Werkstoff BismuthTellurite = new Werkstoff(
- new short[] { 32, 72, 32, 0 },
- // Telluride is correct, tellurite is not.
- // Only the display name gets renamed to avoid problems in other mods
- "Bismuth Telluride",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addChemicalRecipes(),
- 31,
- TextureSet.SET_METALLIC,
- // No Byproducts
- new Pair<>(Materials.Bismuth, 2),
- new Pair<>(Materials.Tellurium, 3));
- public static final Werkstoff Tellurium = new Werkstoff(
- new short[] { 0xff, 0xff, 0xff, 0 },
- "Tellurium",
- new Werkstoff.Stats(),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().addMetalItems()
- .removePrefix(ore),
- 32,
- TextureSet.SET_METALLIC,
- // No Byproducts
- new Pair<>(Materials.Tellurium, 1));
- public static final Werkstoff BismuthHydroBorat = new Werkstoff(
- new short[] { 72, 144, 72, 0 },
- "Dibismuthhydroborat",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addChemicalRecipes(),
- 33,
- TextureSet.SET_METALLIC,
- // No Byproducts
- new Pair<>(Materials.Bismuth, 2),
- new Pair<>(Materials.Boron, 1),
- new Pair<>(Materials.Hydrogen, 1));
- public static final Werkstoff ArInGaPhoBiBoTe = new Werkstoff(
- new short[] { 36, 36, 36, 0 },
- "Circuit Compound MK3",
- new Werkstoff.Stats().setCentrifuge(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMixerRecipes(),
- 34,
- TextureSet.SET_METALLIC,
- // No Byproducts
- new Pair<>(Materials.IndiumGalliumPhosphide, 1),
- new Pair<>(WerkstoffLoader.BismuthHydroBorat, 3),
- new Pair<>(WerkstoffLoader.BismuthTellurite, 2));
-
- public static final Werkstoff Prasiolite = new Werkstoff(
- new short[] { 0xD0, 0xDD, 0x95, 0 },
- "Prasiolite",
- new Werkstoff.Stats().setElektrolysis(false)
- .setMeltingPoint(1923),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 35,
- TextureSet.SET_QUARTZ,
- // No Byproducts
- new Pair<>(Materials.Silicon, 5),
- new Pair<>(Materials.Oxygen, 10),
- new Pair<>(Materials.Iron, 1));
-
- public static final Werkstoff MagnetoResonaticDust = new Werkstoff(
- new short[] { 0xDD, 0x77, 0xDD, 0 },
- "Magneto Resonatic",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().onlyDust()
- .addMixerRecipes()
- .addGems(),
- 36,
- TextureSet.SET_MAGNETIC,
- // No Byproducts
- new Pair<>(WerkstoffLoader.Prasiolite, 3),
- new Pair<>(WerkstoffLoader.BismuthTellurite, 4),
- new Pair<>(WerkstoffLoader.CubicZirconia, 1),
- new Pair<>(Materials.SteelMagnetic, 1));
- public static final Werkstoff Xenon = new Werkstoff(
- new short[] { 0x14, 0x39, 0x7F, 0 },
- "Xenon",
- "Xe",
- new Werkstoff.Stats().setProtons(54)
- .setMass(131)
- .setGas(true)
- .setEbfGasRecipeTimeMultiplier(0.4d)
- .setEbfGasRecipeConsumedAmountMultiplier(0.25d),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .addCells()
- .enforceUnification(),
- 37,
- TextureSet.SET_FLUID
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff Oganesson = new Werkstoff(
- new short[] { 0x14, 0x39, 0x7F, 0 },
- "Oganesson",
- "Og",
- new Werkstoff.Stats().setProtons(118)
- .setMass(294)
- .setGas(true)
- .setEbfGasRecipeTimeMultiplier(0.3d)
- .setEbfGasRecipeConsumedAmountMultiplier(0.1d),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 38,
- TextureSet.SET_FLUID
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff Californium = new Werkstoff(
- new short[] { 0xAA, 0xAA, 0xAA, 0 },
- "Californium",
- "Cf",
- new Werkstoff.Stats().setProtons(98)
- .setMass(251)
- .setBlastFurnace(true)
- .setMeltingPoint(900),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMetalItems()
- .addMolten()
- .enforceUnification(),
- 39,
- TextureSet.SET_METALLIC
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff Calcium = new Werkstoff(
- Materials.Calcium.mRGBa,
- "Calcium",
- "Ca",
- new Werkstoff.Stats().setProtons(Element.Ca.mProtons)
- .setMass(Element.Ca.getMass())
- .setBlastFurnace(true)
- .setMeltingPoint(1115)
- .setBoilingPoint(1757),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMetalItems()
- .addMolten(),
- 40,
- Materials.Calcium.mIconSet,
- // No Byproducts
- new Pair<>(Materials.Calcium, 1));
- public static final Werkstoff Neon = new Werkstoff(
- new short[] { 0xff, 0x07, 0x3a },
- "Neon",
- "Ne",
- new Werkstoff.Stats().setProtons(Element.Ne.mProtons)
- .setMass(Element.Ne.getMass())
- .setGas(true)
- .setEbfGasRecipeTimeMultiplier(0.6d)
- .setEbfGasRecipeConsumedAmountMultiplier(0.55d),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .addCells()
- .enforceUnification(),
- 41,
- TextureSet.SET_FLUID
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff Krypton = new Werkstoff(
- new short[] { 0xb1, 0xff, 0x32 },
- "Krypton",
- "Kr",
- new Werkstoff.Stats().setProtons(Element.Kr.mProtons)
- .setMass(Element.Kr.getMass())
- .setGas(true)
- .setEbfGasRecipeTimeMultiplier(0.5d)
- .setEbfGasRecipeConsumedAmountMultiplier(0.4d),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .addCells()
- .enforceUnification(),
- 42,
- TextureSet.SET_FLUID
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff BArTiMaEuSNeK = new Werkstoff(
- new short[] { 0x00, 0xff, 0x00 },
- "BArTiMaEuSNeK",
- "Are you serious?",
- new Werkstoff.Stats().setMeltingPoint(9001)
- .setCentrifuge(true)
- .setBlastFurnace(true)
- .setMeltingVoltage(1920),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems()
- .addMetalItems()
- .addMolten(),
- 43,
- TextureSet.SET_DIAMOND,
- Arrays.asList(Materials.Boron, Materials.Titanium, Materials.Europium),
- new Pair<>(Materials.Boron, 1),
- new Pair<>(Materials.Argon, 1),
- new Pair<>(Materials.Titanium, 1),
- new Pair<>(Materials.Magic, 1),
- new Pair<>(Materials.Europium, 1),
- new Pair<>(Materials.Sulfur, 1),
- new Pair<>(WerkstoffLoader.Neon, 1),
- new Pair<>(Materials.Potassium, 1));
- public static final Werkstoff PTConcentrate = new Werkstoff(
- Materials.Platinum.getRGBA(),
- "Platinum Concentrate",
- "",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 44,
- TextureSet.SET_FLUID
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff PTSaltCrude = new Werkstoff(
- Materials.Platinum.getRGBA(),
- "Platinum Salt",
- "",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 45,
- TextureSet.SET_DULL
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff PTSaltRefined = new Werkstoff(
- Materials.Platinum.getRGBA(),
- "Refined Platinum Salt",
- "",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 46,
- TextureSet.SET_METALLIC
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff PTMetallicPowder = new Werkstoff(
- Materials.Platinum.getRGBA(),
- "Platinum Metallic Powder",
- "??PtPdIrOsRhRu??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures(),
- 47,
- TextureSet.SET_METALLIC,
- // No Byproducts
- new Pair<>(Materials.Platinum, 1),
- new Pair<>(Materials.Stone, 2));
- public static final Werkstoff AquaRegia = new Werkstoff(
- new short[] { 0xff, 0xb1, 0x32 },
- "Aqua Regia",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 48,
- TextureSet.SET_FLUID,
- // No Byproducts
- new Pair<>(Materials.DilutedSulfuricAcid, 1),
- new Pair<>(Materials.NitricAcid, 1));
- public static final Werkstoff PTResidue = new Werkstoff(
- new short[] { 0x64, 0x63, 0x2E },
- "Platinum Residue",
- "??IrOsRhRu??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 49,
- TextureSet.SET_ROUGH
- // No Byproducts
- );
- public static final Werkstoff AmmoniumChloride = new Werkstoff(
- new short[] { 0xff, 0xff, 0xff },
- "Ammonium Chloride",
- subscriptNumbers("NH4Cl"),
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 50,
- TextureSet.SET_FLUID,
- // No Byproducts
- new Pair<>(Materials.Ammonium, 1),
- new Pair<>(Materials.HydrochloricAcid, 1));
- public static final Werkstoff PTRawPowder = new Werkstoff(
- Materials.Platinum.getRGBA(),
- "Reprecipitated Platinum",
- "PtCl",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 51,
- TextureSet.SET_METALLIC
- // No Byproducts
- );
- public static final Werkstoff PDAmmonia = new Werkstoff(
- Materials.Palladium.getRGBA(),
- "Palladium Enriched Ammonia",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 52,
- TextureSet.SET_FLUID,
- // No Byproducts
- new Pair<>(Materials.Ammonium, 1),
- new Pair<>(Materials.Palladium, 1));
- public static final Werkstoff PDMetallicPowder = new Werkstoff(
- Materials.Palladium.getRGBA(),
- "Palladium Metallic Powder",
- "??Pd??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures(),
- 53,
- TextureSet.SET_METALLIC,
- // No Byproducts
- new Pair<>(Materials.Palladium, 1),
- new Pair<>(Materials.Stone, 2));
- public static final Werkstoff PDRawPowder = new Werkstoff(
- Materials.Palladium.getRGBA(),
- "Reprecipitated Palladium",
- subscriptNumbers("Pd2NH4"),
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 54,
- TextureSet.SET_METALLIC
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff PDSalt = new Werkstoff(
- Materials.Palladium.getRGBA(),
- "Palladium Salt",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 55,
- TextureSet.SET_METALLIC
- // No Byproducts
- // No Ingredients
- );
- public static final Werkstoff Sodiumformate = new Werkstoff(
- new short[] { 0xff, 0xaa, 0xaa },
- "Sodium Formate",
- "HCOONa",
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 56,
- TextureSet.SET_FLUID,
- // No Byproducts
- new Pair<>(Materials.SodiumHydroxide, 1),
- new Pair<>(Materials.CarbonMonoxide, 1));
- public static final Werkstoff Sodiumsulfate = new Werkstoff(
- new short[] { 0xff, 0xff, 0xff },
- "Sodium Sulfate",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 57,
- TextureSet.SET_FLUID,
- // No Byproducts
- new Pair<>(Materials.Sodium, 2),
- new Pair<>(Materials.Sulfur, 1),
- new Pair<>(Materials.Oxygen, 4));
- public static final Werkstoff FormicAcid = new Werkstoff(
- new short[] { 0xff, 0xaa, 0x77 },
- "Formic Acid",
- subscriptNumbers("CH2O2"),
- new Werkstoff.Stats().setElektrolysis(false),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 58,
- TextureSet.SET_FLUID,
- // No Byproducts
- new Pair<>(Materials.Carbon, 1),
- new Pair<>(Materials.Hydrogen, 2),
- new Pair<>(Materials.Oxygen, 2));
- public static final Werkstoff PotassiumDisulfate = new Werkstoff(
- new short[] { 0xfb, 0xbb, 0x66 },
- "Potassium Disulfate",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMolten()
- .addChemicalRecipes(),
- 59,
- TextureSet.SET_DULL,
- // No Byproducts
- new Pair<>(Materials.Potassium, 2),
- new Pair<>(Materials.Sulfur, 2),
- new Pair<>(Materials.Oxygen, 7));
- public static final Werkstoff LeachResidue = new Werkstoff(
- new short[] { 0x64, 0x46, 0x29 },
- "Leach Residue",
- "??IrOsRu??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures(),
- 60,
- TextureSet.SET_ROUGH
- // No Byproducts
- );
- public static final Werkstoff RHSulfate = new Werkstoff(
- new short[] { 0xee, 0xaa, 0x55 },
- "Rhodium Sulfate",
- new Werkstoff.Stats().setGas(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 61,
- TextureSet.SET_FLUID
- // No Byproducts
- );
- public static final Werkstoff RHSulfateSolution = new Werkstoff(
- new short[] { 0xff, 0xbb, 0x66 },
- "Rhodium Sulfate Solution",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 62,
- TextureSet.SET_FLUID
- // No Byproducts
- );
- public static final Werkstoff CalciumChloride = new Werkstoff(
- new short[] { 0xff, 0xff, 0xff },
- "Calcium Chloride",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addCells(),
- 63,
- TextureSet.SET_DULL,
- new Pair<>(Materials.Calcium, 1),
- new Pair<>(Materials.Chlorine, 2)
- // No Byproducts
- );
- public static final Werkstoff Ruthenium = new Werkstoff(
- new short[] { 0x64, 0x64, 0x64 },
- "Ruthenium",
- "Ru",
- new Werkstoff.Stats().setBlastFurnace(true)
- .setMeltingPoint(2607)
- .setMass(Element.Ru.getMass())
- .setProtons(Element.Ru.mProtons),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().onlyDust()
- .addMolten()
- .addMetalItems()
- .enforceUnification(),
- 64,
- TextureSet.SET_METALLIC
- // No Byproducts
- );
- public static final Werkstoff SodiumRuthenate = new Werkstoff(
- new short[] { 0x3a, 0x40, 0xcb },
- "Sodium Ruthenate",
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 65,
- TextureSet.SET_SHINY,
- new Pair<>(Materials.Sodium, 2),
- new Pair<>(Ruthenium, 1),
- new Pair<>(Materials.Oxygen, 3)
- // No Byproducts
- );
- public static final Werkstoff RutheniumTetroxide = new Werkstoff(
- new short[] { 0xc7, 0xc7, 0xc7 },
- "Ruthenium Tetroxide",
- new Werkstoff.Stats().setMeltingPoint(313),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addCells(),
- 66,
- TextureSet.SET_DULL,
- new Pair<>(WerkstoffLoader.Ruthenium, 1),
- new Pair<>(Materials.Oxygen, 4)
- // No Byproducts
- );
- public static final Werkstoff HotRutheniumTetroxideSollution = new Werkstoff(
- new short[] { 0xc7, 0xc7, 0xc7 },
- "Hot Ruthenium Tetroxide Solution",
- "???",
- new Werkstoff.Stats().setGas(true)
- .setMeltingPoint(700),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 67,
- TextureSet.SET_FLUID,
- new Pair<>(WerkstoffLoader.Ruthenium, 1),
- new Pair<>(Materials.Oxygen, 4),
- new Pair<>(Materials.Chlorine, 2),
- new Pair<>(Materials.Sodium, 2),
- new Pair<>(Materials.Water, 2)
- // No Byproducts
- );
- public static final Werkstoff RutheniumTetroxideSollution = new Werkstoff(
- new short[] { 0xc7, 0xc7, 0xc7 },
- "Ruthenium Tetroxide Solution",
- "???",
- new Werkstoff.Stats().setMeltingPoint(313),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 68,
- TextureSet.SET_FLUID,
- new Pair<>(Ruthenium, 1),
- new Pair<>(Materials.Oxygen, 4),
- new Pair<>(Materials.Chlorine, 2),
- new Pair<>(Materials.Sodium, 2),
- new Pair<>(Materials.Water, 2)
- // No Byproducts
- );
- public static final Werkstoff IrOsLeachResidue = new Werkstoff(
- new short[] { 0x64, 0x46, 0x29 },
- "Rarest Metal Residue",
- "??OsIr??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures(),
- 69,
- TextureSet.SET_ROUGH,
- // No Byproducts
- new Pair<>(Materials.Osmiridium, 1),
- new Pair<>(Materials.Stone, 2));
- public static final Werkstoff IrLeachResidue = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Iridium Metal Residue",
- "??Ir??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures(),
- 70,
- TextureSet.SET_ROUGH,
- new Pair<>(Materials.Iridium, 1),
- new Pair<>(Materials.Stone, 2)
- // No Byproducts
- );
- public static final Werkstoff PGSDResidue = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Sludge Dust Residue",
- new Werkstoff.Stats().setCentrifuge(true),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 71,
- TextureSet.SET_DULL,
- new Pair<>(Materials.SiliconDioxide, 3),
- new Pair<>(Materials.Gold, 2));
- public static final Werkstoff AcidicOsmiumSolution = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Acidic Osmium Solution",
- "???",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 72,
- TextureSet.SET_FLUID,
- new Pair<>(Materials.Osmium, 1),
- new Pair<>(Materials.HydrochloricAcid, 1));
- public static final Werkstoff IridiumDioxide = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Iridium Dioxide",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 73,
- TextureSet.SET_FLUID,
- new Pair<>(Materials.Iridium, 1),
- new Pair<>(Materials.Oxygen, 2));
- public static final Werkstoff OsmiumSolution = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Osmium Solution",
- "???",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 74,
- TextureSet.SET_FLUID,
- new Pair<>(Materials.Osmium, 1),
- new Pair<>(Materials.Hydrogen, 1));
- public static final Werkstoff AcidicIridiumSolution = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Acidic Iridium Solution",
- "???",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 75,
- TextureSet.SET_FLUID,
- new Pair<>(Materials.Iridium, 1),
- new Pair<>(Materials.Hydrogen, 1));
- public static final Werkstoff IridiumChloride = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Iridium Chloride",
- subscriptNumbers("IrCl3"),
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 76,
- TextureSet.SET_LAPIS,
- new Pair<>(Materials.Iridium, 1),
- new Pair<>(Materials.Chlorine, 3));
- public static final Werkstoff PGSDResidue2 = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Metallic Sludge Dust Residue",
- new Werkstoff.Stats().setCentrifuge(true),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 77,
- TextureSet.SET_DULL,
- new Pair<>(Materials.Nickel, 1),
- new Pair<>(Materials.Copper, 1));
- public static final Werkstoff Rhodium = new Werkstoff(
- new short[] { 0xF4, 0xF4, 0xF4 },
- "Rhodium",
- "Rh",
- new Werkstoff.Stats().setProtons(Element.Rh.mProtons)
- .setMass(Element.Rh.getMass())
- .setBlastFurnace(true)
- .setMeltingPoint(2237),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMetalItems()
- .addMolten()
- .enforceUnification(),
- 78,
- TextureSet.SET_METALLIC);
- public static final Werkstoff CrudeRhMetall = new Werkstoff(
- new short[] { 0x66, 0x66, 0x66 },
- "Crude Rhodium Metal",
- "??Rh??",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures(),
- 79,
- TextureSet.SET_DULL,
- new Pair<>(Rhodium, 1),
- new Pair<>(Materials.Stone, 1));
- public static final Werkstoff RHSalt = new Werkstoff(
- new short[] { 0x84, 0x84, 0x84 },
- "Rhodium Salt",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 80,
- TextureSet.SET_GEM_VERTICAL);
- public static final Werkstoff RHSaltSolution = new Werkstoff(
- new short[] { 0x66, 0x77, 0x88 },
- "Rhodium Salt Solution",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 81,
- TextureSet.SET_FLUID);
- public static final Werkstoff SodiumNitrate = new Werkstoff(
- new short[] { 0x84, 0x66, 0x84 },
- "Sodium Nitrate",
- subscriptNumbers("NaNO3"),
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 82,
- TextureSet.SET_ROUGH,
- new Pair<>(Materials.Sodium, 1),
- new Pair<>(Materials.Nitrogen, 1),
- new Pair<>(Materials.Oxygen, 3));
- public static final Werkstoff RHNitrate = new Werkstoff(
- new short[] { 0x77, 0x66, 0x49 },
- "Rhodium Nitrate",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 83,
- TextureSet.SET_QUARTZ);
- public static final Werkstoff ZincSulfate = new Werkstoff(
- new short[] { 0x84, 0x66, 0x49 },
- "Zinc Sulfate",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 84,
- TextureSet.SET_QUARTZ,
- new Pair<>(Materials.Zinc, 1),
- new Pair<>(Materials.Sulfur, 1),
- new Pair<>(Materials.Oxygen, 4));
- public static final Werkstoff RhFilterCake = new Werkstoff(
- new short[] { 0x77, 0x66, 0x49 },
- "Rhodium Filter Cake",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 85,
- TextureSet.SET_QUARTZ);
- public static final Werkstoff RHFilterCakeSolution = new Werkstoff(
- new short[] { 0x66, 0x77, 0x88 },
- "Rhodium Filter Cake Solution",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 86,
- TextureSet.SET_FLUID);
- public static final Werkstoff ReRh = new Werkstoff(
- new short[] { 0x77, 0x66, 0x49 },
- "Reprecipitated Rhodium",
- subscriptNumbers("Rh2NH4"),
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 87,
- TextureSet.SET_QUARTZ);
- public static final Werkstoff LuVTierMaterial = new Werkstoff(
- Materials.Chrome.getRGBA(),
- "Rhodium-Plated Palladium",
- new Werkstoff.Stats().setCentrifuge(true)
- .setBlastFurnace(true)
- .setMeltingPoint(4500)
- .setMeltingVoltage(480),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMolten()
- .addMetalItems()
- .addMixerRecipes((short) 1)
- .addSimpleMetalWorkingItems()
- .addCraftingMetalWorkingItems()
- .addMultipleIngotMetalWorkingItems(),
- 88,
- TextureSet.SET_METALLIC,
- new Pair<>(Materials.Palladium, 3),
- new Pair<>(WerkstoffLoader.Rhodium, 1));
- public static final Werkstoff Tiberium = new Werkstoff(
- new short[] { 0x22, 0xEE, 0x22 },
- "Tiberium",
- "Tr",
- new Werkstoff.Stats().setProtons(123)
- .setMass(326)
- .setBlastFurnace(true)
- .setMeltingPoint(1800)
- .setRadioactive(true)
- .setToxic(true),
- Werkstoff.Types.ELEMENT,
- new Werkstoff.GenerationFeatures().addGems()
- .addCraftingMetalWorkingItems()
- .addSimpleMetalWorkingItems(),
- 89,
- TextureSet.SET_DIAMOND);
- public static final Werkstoff Ruridit = new Werkstoff(
- new short[] { 0xA4, 0xA4, 0xA4 },
- "Ruridit",
- new Werkstoff.Stats().setCentrifuge(true)
- .setBlastFurnace(true)
- .setMeltingPoint(4500)
- .setMeltingVoltage(480),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMolten()
- .addMetalItems()
- .addMixerRecipes((short) 1)
- .addSimpleMetalWorkingItems()
- .addCraftingMetalWorkingItems()
- .addMultipleIngotMetalWorkingItems(),
- 90,
- TextureSet.SET_METALLIC,
- new Pair<>(WerkstoffLoader.Ruthenium, 2),
- new Pair<>(Materials.Iridium, 1));
- public static final Werkstoff Fluorspar = new Werkstoff(
- new short[] { 185, 69, 251 },
- "Fluorspar",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().addGems(),
- 91,
- TextureSet.SET_GEM_VERTICAL,
- new Pair<>(Materials.Calcium, 1),
- new Pair<>(Materials.Fluorine, 2));
- public static final Werkstoff HDCS = new Werkstoff(
- new short[] { 0x33, 0x44, 0x33 },
- "High Durability Compound Steel",
- new Werkstoff.Stats().setCentrifuge(true)
- .setBlastFurnace(true)
- .setMeltingPoint(9000)
- .setMeltingVoltage(7680),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMolten()
- .addMetalItems()
- .addMixerRecipes()
- .addSimpleMetalWorkingItems()
- .addCraftingMetalWorkingItems()
- .addMultipleIngotMetalWorkingItems(),
- 92,
- TextureSet.SET_SHINY,
- new Pair<>(Materials.TungstenSteel, 12),
- new Pair<>(Materials.HSSE, 9),
- new Pair<>(Materials.HSSG, 6),
- new Pair<>(WerkstoffLoader.Ruridit, 3),
- new Pair<>(WerkstoffLoader.MagnetoResonaticDust, 2),
- new Pair<>(Materials.Plutonium, 1));
- public static final Werkstoff Atheneite = new Werkstoff(
- new short[] { 175, 175, 175 },
- "Atheneite",
- subscriptNumbers("(Pd,Hg)3As"),
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 93,
- TextureSet.SET_SHINY,
- new Pair<>(WerkstoffLoader.PDMetallicPowder, 3),
- new Pair<>(Materials.Mercury, 3),
- new Pair<>(Materials.Arsenic, 1));
- public static final Werkstoff Temagamite = new Werkstoff(
- new short[] { 245, 245, 245 },
- "Temagamite",
- subscriptNumbers("Pd3HgTe"),
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 94,
- TextureSet.SET_ROUGH,
- new Pair<>(WerkstoffLoader.PDMetallicPowder, 3),
- new Pair<>(Materials.Mercury, 1),
- new Pair<>(Materials.Tellurium, 1));
- public static final Werkstoff Terlinguaite = new Werkstoff(
- new short[] { 245, 245, 245 },
- "Terlinguaite",
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures(),
- 95,
- TextureSet.SET_GEM_HORIZONTAL,
- new Pair<>(Materials.Mercury, 2),
- new Pair<>(Materials.Chlorine, 1),
- new Pair<>(Materials.Oxygen, 1));
- public static final Werkstoff AdemicSteel = new Werkstoff(
- new short[] { 0xcc, 0xcc, 0xcc },
- "Ademic Steel",
- "The break in the line",
- new Werkstoff.Stats().setCentrifuge(true)
- .setBlastFurnace(true)
- .setDurOverride(6144)
- .setMeltingPoint(1800)
- .setSpeedOverride(12)
- .setQualityOverride((byte) 4)
- .setMeltingVoltage(1920),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().onlyDust()
- .addMetalItems()
- .addCraftingMetalWorkingItems()
- .addMolten()
- .addSimpleMetalWorkingItems()
- .addMultipleIngotMetalWorkingItems(),
- 96,
- TextureSet.SET_METALLIC,
- new Pair<>(Materials.Steel, 2),
- new Pair<>(Materials.VanadiumSteel, 1),
- new Pair<>(Materials.DamascusSteel, 1),
- new Pair<>(Materials.Carbon, 4));
- public static final Werkstoff RawAdemicSteel = new Werkstoff(
- new short[] { 0xed, 0xed, 0xed },
- "Raw Ademic Steel",
- new Werkstoff.Stats().setCentrifuge(true),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().onlyDust()
- .addMixerRecipes(),
- 97,
- TextureSet.SET_ROUGH,
- new Pair<>(Materials.Steel, 2),
- new Pair<>(Materials.VanadiumSteel, 1),
- new Pair<>(Materials.DamascusSteel, 1));
- public static final Werkstoff HexafluorosilicicAcid = new Werkstoff(
- new short[] { 0x2c, 0x70, 0xb5 },
- "Hexafluorosilicic Acid",
- subscriptNumbers("H2SiF6"),
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 98,
- TextureSet.SET_FLUID,
- new Pair<>(Materials.Hydrogen, 2),
- new Pair<>(Materials.Silicon, 1),
- new Pair<>(Materials.Fluorine, 6));
- public static final Werkstoff Potassiumfluorosilicate = new Werkstoff(
- new short[] { 0x2e, 0x97, 0xb2 },
- "Potassiumfluorosilicate",
- subscriptNumbers("K2SiF6"),
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 99,
- TextureSet.SET_SHINY,
- new Pair<>(Materials.Potassium, 2),
- new Pair<>(Materials.Silicon, 1),
- new Pair<>(Materials.Fluorine, 6));
- public static final Werkstoff Alumina = new Werkstoff(
- new short[] { 0xa0, 0xad, 0xb1 },
- "Alumina",
- subscriptNumbers("Al2O3"),
- new Werkstoff.Stats(),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 100,
- TextureSet.SET_DULL);
- public static final Werkstoff PotassiumCarbonate = new Werkstoff(
- new short[] { 0x7b, 0x96, 0x4f },
- "Potassium Carbonate",
- subscriptNumbers("K2CO3"),
- new Werkstoff.Stats().setElektrolysis(true),
- Werkstoff.Types.COMPOUND,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 101,
- TextureSet.SET_DULL,
- new Pair<>(Materials.Potassium, 2),
- new Pair<>(Materials.Carbon, 1),
- new Pair<>(Materials.Oxygen, 3));
- public static final Werkstoff RawFluorophlogopite = new Werkstoff(
- new short[] { 0x36, 0x51, 0x0b },
- "Raw Fluorophlogopite",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust(),
- 102,
- TextureSet.SET_DULL);
- public static final Werkstoff HotFluorophlogopite = new Werkstoff(
- new short[] { 0xbf, 0xd3, 0x55 },
- "Unformed Fluorophlogopite",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .addCells(),
- 103,
- TextureSet.SET_FLUID);
- public static final Werkstoff Fluorophlogopite = new Werkstoff(
- new short[] { 0xbf, 0xd3, 0x55 },
- "Fluorophlogopite",
- new Werkstoff.Stats(),
- Werkstoff.Types.MIXTURE,
- new Werkstoff.GenerationFeatures().disable()
- .onlyDust()
- .addMetalItems(),
- 104,
- TextureSet.SET_SHINY);
-
- public static HashMap<OrePrefixes, BW_MetaGenerated_Items> items = new HashMap<>();
- public static HashBiMap<Werkstoff, Fluid> fluids = HashBiMap.create();
- public static HashBiMap<Werkstoff, Fluid> molten = HashBiMap.create();
- public static Block BWOres;
- public static Block BWSmallOres;
- public static Block BWBlocks;
- public static Block BWBlockCasings;
- public static Block BWBlockCasingsAdvanced;
- public static boolean registered;
- public static final HashSet<OrePrefixes> ENABLED_ORE_PREFIXES = new HashSet<>();
-
- public static Werkstoff getWerkstoff(String Name) {
- try {
- Field f = WerkstoffLoader.class.getField(Name);
- return (Werkstoff) f.get(null);
- } catch (IllegalAccessException | NoSuchFieldException | ClassCastException e) {
- MainMod.LOGGER.catching(e);
- }
- return Werkstoff.default_null_Werkstoff;
- }
-
- public static ItemStack getCorrespondingItemStack(OrePrefixes orePrefixes, Werkstoff werkstoff) {
- return WerkstoffLoader.getCorrespondingItemStack(orePrefixes, werkstoff, 1);
- }
-
- public static ItemStack getCorrespondingItemStackUnsafe(OrePrefixes orePrefixes, Werkstoff werkstoff, int amount) {
- if (!werkstoff.getGenerationFeatures().enforceUnification) {
- ItemStack ret = GT_OreDictUnificator.get(orePrefixes, werkstoff.getBridgeMaterial(), amount);
- if (ret != null) return ret;
- ret = OreDictHandler.getItemStack(werkstoff.getVarName(), orePrefixes, amount);
- if (ret != null) return ret;
- }
- if (orePrefixes == ore) return new ItemStack(WerkstoffLoader.BWOres, amount, werkstoff.getmID());
- if (orePrefixes == oreSmall) return new ItemStack(WerkstoffLoader.BWSmallOres, amount, werkstoff.getmID());
- else if (orePrefixes == block) return new ItemStack(WerkstoffLoader.BWBlocks, amount, werkstoff.getmID());
- else if (orePrefixes == OrePrefixes.blockCasing)
- return new ItemStack(WerkstoffLoader.BWBlockCasings, amount, werkstoff.getmID());
- else if (orePrefixes == OrePrefixes.blockCasingAdvanced)
- return new ItemStack(WerkstoffLoader.BWBlockCasingsAdvanced, amount, werkstoff.getmID());
- else if (WerkstoffLoader.items.get(orePrefixes) == null) return null;
- return new ItemStack(WerkstoffLoader.items.get(orePrefixes), amount, werkstoff.getmID()).copy();
- }
-
- public static ItemStack getCorrespondingItemStack(OrePrefixes orePrefixes, Werkstoff werkstoff, int amount) {
- ItemStack stack = getCorrespondingItemStackUnsafe(orePrefixes, werkstoff, amount);
- if (stack != null) return stack;
- MainMod.LOGGER.catching(
- Level.ERROR,
- new Exception(
- "NO SUCH ITEM! " + orePrefixes
- + werkstoff.getVarName()
- + " If you encounter this as a user, make sure to contact the authors of the pack/the mods you're playing! "
- + "If you are a Developer, you forgot to enable "
- + orePrefixes
- + " OrePrefix for Werkstoff "
- + werkstoff.getDefaultName()));
- return new ItemStack(WerkstoffLoader.items.get(orePrefixes), amount, werkstoff.getmID()).copy();
- }
-
- public static void runInit() {
- MainMod.LOGGER.info("Making Meta Items for BW Materials");
- long timepre = System.nanoTime();
- WerkstoffAdderRegistry.run();
- addSubTags();
- addItemsForGeneration();
- addBridgeSubTags();
- runAdditionalOreDict();
- long timepost = System.nanoTime();
- MainMod.LOGGER.info(
- "Making Meta Items for BW Materials took " + (timepost - timepre)
- + "ns/"
- + (timepost - timepre) / 1000000
- + "ms/"
- + (timepost - timepre) / 1000000000
- + "s!");
- }
-
- public static void run() {
- if (!registered) {
- MainMod.LOGGER.info("Loading Processing Recipes for BW Materials");
- long timepre = System.nanoTime();
- ProgressManager.ProgressBar progressBar = ProgressManager
- .push("Register BW Materials", Werkstoff.werkstoffHashSet.size() + 1);
- DebugLog.log("Loading Recipes" + (System.nanoTime() - timepre));
- Integer[] clsArr = {};
- int size = 0;
- if (BetterLoadingScreen.isModLoaded()) clsArr = CLSCompat.initCls();
-
- IWerkstoffRunnable[] werkstoffRunnables = { new ToolLoader(), new DustLoader(), new GemLoader(),
- new SimpleMetalLoader(), new CasingLoader(), new AspectLoader(), new OreLoader(), new RawOreLoader(),
- new CrushedLoader(), new CraftingMaterialLoader(), new CellLoader(), new MoltenCellLoader(),
- new MultipleMetalLoader(), new MetalLoader(), new BlockLoader() };
-
- long timepreone = 0;
- for (Werkstoff werkstoff : Werkstoff.werkstoffHashSet) {
- timepreone = System.nanoTime();
- DebugLog.log(
- "Werkstoff is null or id < 0 ? " + (werkstoff == null || werkstoff.getmID() < 0)
- + " "
- + (System.nanoTime() - timepreone));
- if (werkstoff == null || werkstoff.getmID() < 0) {
- progressBar.step("");
- continue;
- }
- if (BetterLoadingScreen.isModLoaded()) size = CLSCompat.invokeStepSize(werkstoff, clsArr, size);
- DebugLog.log("Werkstoff: " + werkstoff.getDefaultName() + " " + (System.nanoTime() - timepreone));
- for (IWerkstoffRunnable runnable : werkstoffRunnables) {
- String loaderName = runnable.getClass()
- .getSimpleName();
- DebugLog.log(loaderName + " started " + (System.nanoTime() - timepreone));
- runnable.run(werkstoff);
- DebugLog.log(loaderName + " done " + (System.nanoTime() - timepreone));
- }
- DebugLog.log("Done" + " " + (System.nanoTime() - timepreone));
- progressBar.step(werkstoff.getDefaultName());
- }
- DebugLog.log("Loading New Circuits" + " " + (System.nanoTime() - timepreone));
- BW_CircuitsLoader.initNewCircuits();
-
- if (BetterLoadingScreen.isModLoaded()) {
- CLSCompat.disableCls();
- }
-
- progressBar.step("Load Additional Recipes");
- AdditionalRecipes.run();
- ProgressManager.pop(progressBar);
- long timepost = System.nanoTime();
- MainMod.LOGGER.info(
- "Loading Processing Recipes for BW Materials took " + (timepost - timepre)
- + "ns/"
- + (timepost - timepre) / 1000000
- + "ms/"
- + (timepost - timepre) / 1000000000
- + "s!");
- registered = true;
- }
- }
-
- @SuppressWarnings("unchecked")
- private static void addSubTags() {
- WerkstoffLoader.CubicZirconia.getStats()
- .setDurOverride(Materials.Diamond.mDurability);
- WerkstoffLoader.HDCS.getStats()
- .setSpeedOverride(Materials.HSSS.mToolSpeed);
- WerkstoffLoader.HDCS.getStats()
- .setDurMod(10f);
- Materials.Helium.add(WerkstoffLoader.NOBLE_GAS);
- WerkstoffLoader.Neon.add(WerkstoffLoader.NOBLE_GAS);
- Materials.Argon.add(WerkstoffLoader.NOBLE_GAS);
- WerkstoffLoader.Krypton.add(WerkstoffLoader.NOBLE_GAS);
- WerkstoffLoader.Xenon.add(WerkstoffLoader.NOBLE_GAS, WerkstoffLoader.ANAEROBE_GAS);
- Materials.Radon.add(WerkstoffLoader.NOBLE_GAS);
- WerkstoffLoader.Oganesson.add(WerkstoffLoader.NOBLE_GAS, WerkstoffLoader.ANAEROBE_GAS);
-
- Materials.Nitrogen.add(WerkstoffLoader.ANAEROBE_GAS);
-
- WerkstoffLoader.Calcium.add(WerkstoffLoader.ANAEROBE_SMELTING);
-
- WerkstoffLoader.LuVTierMaterial.add(WerkstoffLoader.NOBLE_GAS_SMELTING);
- WerkstoffLoader.Ruridit.add(WerkstoffLoader.NOBLE_GAS_SMELTING);
- WerkstoffLoader.AdemicSteel.add(WerkstoffLoader.NOBLE_GAS_SMELTING);
-
- WerkstoffLoader.MagnetoResonaticDust.add(WerkstoffLoader.NO_BLAST);
-
- // Calcium Smelting block
- Materials.Calcium.mBlastFurnaceRequired = true;
-
- Materials.Salt.mDurability = WerkstoffLoader.Salt.getDurability();
- Materials.Spodumene.mDurability = WerkstoffLoader.Spodumen.getDurability();
- Materials.RockSalt.mDurability = WerkstoffLoader.RockSalt.getDurability();
- Materials.Calcium.mDurability = WerkstoffLoader.Calcium.getDurability();
-
- Materials.Salt.mToolSpeed = WerkstoffLoader.Salt.getToolSpeed();
- Materials.Spodumene.mToolSpeed = WerkstoffLoader.Spodumen.getToolSpeed();
- Materials.RockSalt.mToolSpeed = WerkstoffLoader.RockSalt.getToolSpeed();
- Materials.Calcium.mToolSpeed = WerkstoffLoader.Calcium.getToolSpeed();
-
- Materials.Salt.mToolQuality = WerkstoffLoader.Salt.getToolQuality();
- Materials.Spodumene.mToolQuality = WerkstoffLoader.Spodumen.getToolQuality();
- Materials.RockSalt.mToolQuality = WerkstoffLoader.RockSalt.getToolQuality();
- Materials.Calcium.mToolQuality = WerkstoffLoader.Calcium.getToolQuality();
-
- for (Werkstoff W : Werkstoff.werkstoffHashSet) {
- for (Pair<ISubTagContainer, Integer> pair : W.getContents()
- .getValue()
- .toArray(new Pair[0])) {
-
- if (pair.getKey() instanceof Materials && pair.getKey() == Materials.Neodymium) {
- W.add(SubTag.ELECTROMAGNETIC_SEPERATION_NEODYMIUM);
- break;
- }
- if (pair.getKey() instanceof Materials && pair.getKey() == Materials.Iron) {
- W.add(SubTag.ELECTROMAGNETIC_SEPERATION_IRON);
- break;
- } else if (pair.getKey() instanceof Materials && pair.getKey() == Materials.Gold) {
- W.add(SubTag.ELECTROMAGNETIC_SEPERATION_GOLD);
- break;
- }
- }
- if (W.hasItemType(gem)) {
- W.add(SubTag.CRYSTAL);
- W.add(SubTag.CRYSTALLISABLE);
- }
- }
- }
-
- private static void addBridgeSubTags() {
- // add specific GT materials subtags to various werkstoff bridgematerials
-
- SubTag.METAL.addTo(LuVTierMaterial.getBridgeMaterial());
- }
-
- public static long toGenerateGlobal;
-
- private static void addItemsForGeneration() {
- for (Werkstoff werkstoff : Werkstoff.werkstoffHashSet) {
- if (werkstoff.hasItemType(cell)) {
- if (!FluidRegistry.isFluidRegistered(werkstoff.getDefaultName())) {
- DebugLog.log("Adding new Fluid: " + werkstoff.getDefaultName());
- Fluid fluid = GT_FluidFactory.builder(werkstoff.getDefaultName())
- .withLocalizedName(werkstoff.getDefaultName())
- .withStateAndTemperature(
- werkstoff.getStats()
- .getFluidState(),
- 300)
- .withColorRGBA(werkstoff.getRGBA())
- .withTextureName("autogenerated")
- .buildAndRegister()
- .asFluid();
- WerkstoffLoader.fluids.put(werkstoff, fluid);
- } else {
- WerkstoffLoader.fluids.put(werkstoff, FluidRegistry.getFluid(werkstoff.getDefaultName()));
- }
- }
- if (werkstoff.hasItemType(OrePrefixes.cellMolten)) {
- if (!FluidRegistry.isFluidRegistered("molten." + werkstoff.getDefaultName())) {
- DebugLog.log("Adding new Molten: " + werkstoff.getDefaultName());
- Fluid fluid = GT_FluidFactory.builder("molten." + werkstoff.getDefaultName())
- .withLocalizedName("Molten " + werkstoff.getDefaultName())
- .withStateAndTemperature(
- FluidState.MOLTEN,
- werkstoff.getStats()
- .getMeltingPoint() > 0 ? werkstoff.getStats()
- .getMeltingPoint() : 300)
- .withColorRGBA(werkstoff.getRGBA())
- .withTextureName("molten.autogenerated")
- .buildAndRegister()
- .asFluid();
- WerkstoffLoader.molten.put(werkstoff, fluid);
- } else {
- WerkstoffLoader.molten.put(werkstoff, FluidRegistry.getFluid(werkstoff.getDefaultName()));
- }
- }
- for (OrePrefixes p : values()) if (Materials.get(werkstoff.getDefaultName()) != null
- && Materials.get(werkstoff.getDefaultName()).mMetaItemSubID != -1
- && (werkstoff.getGenerationFeatures().toGenerate & p.mMaterialGenerationBits) != 0
- && OreDictHandler.getItemStack(werkstoff.getDefaultName(), p, 1) != null) {
- DebugLog.log(
- "Found: " + p
- + werkstoff.getVarName()
- + " in GT material system, disable and reroute my Items to that, also add a Tooltip.");
- werkstoff.getGenerationFeatures()
- .setBlacklist(p);
- }
- WerkstoffLoader.toGenerateGlobal = WerkstoffLoader.toGenerateGlobal
- | werkstoff.getGenerationFeatures().toGenerate;
- }
- DebugLog.log("GlobalGeneration: " + WerkstoffLoader.toGenerateGlobal);
- if ((WerkstoffLoader.toGenerateGlobal & 0b1) != 0) {
- WerkstoffLoader.items.put(dust, new BW_MetaGenerated_Items(dust));
- WerkstoffLoader.items.put(dustTiny, new BW_MetaGenerated_Items(dustTiny));
- WerkstoffLoader.items.put(dustSmall, new BW_MetaGenerated_Items(dustSmall));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b10) != 0) {
- WerkstoffLoader.items.put(ingot, new BW_MetaGenerated_Items(ingot));
- WerkstoffLoader.items.put(ingotHot, new BW_MetaGenerated_Items(ingotHot)); // 1750
- WerkstoffLoader.items.put(nugget, new BW_MetaGenerated_Items(nugget));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b100) != 0) {
- WerkstoffLoader.items.put(gem, new BW_MetaGenerated_Items(gem));
- WerkstoffLoader.items.put(gemChipped, new BW_MetaGenerated_Items(gemChipped));
- WerkstoffLoader.items.put(gemExquisite, new BW_MetaGenerated_Items(gemExquisite));
- WerkstoffLoader.items.put(gemFlawed, new BW_MetaGenerated_Items(gemFlawed));
- WerkstoffLoader.items.put(gemFlawless, new BW_MetaGenerated_Items(gemFlawless));
- WerkstoffLoader.items.put(lens, new BW_MetaGenerated_Items(lens));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b1000) != 0) {
- gameRegistryHandler();
- WerkstoffLoader.items.put(crushed, new BW_MetaGenerated_Items(crushed));
- WerkstoffLoader.items.put(crushedPurified, new BW_MetaGenerated_Items(crushedPurified));
- WerkstoffLoader.items.put(crushedCentrifuged, new BW_MetaGenerated_Items(crushedCentrifuged));
- WerkstoffLoader.items.put(dustPure, new BW_MetaGenerated_Items(dustPure));
- WerkstoffLoader.items.put(dustImpure, new BW_MetaGenerated_Items(dustImpure));
- WerkstoffLoader.items.put(rawOre, new BW_MetaGenerated_Items(rawOre));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b10000) != 0) {
- WerkstoffLoader.items.put(cell, new BW_MetaGenerated_Items(cell));
- if (Forestry.isModLoaded()) WerkstoffLoader.items.put(capsule, new BW_MetaGenerated_Items(capsule));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b100000) != 0) {
- WerkstoffLoader.items.put(cellPlasma, new BW_MetaGenerated_Items(cellPlasma));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b1000000) != 0) {
- WerkstoffLoader.items.put(OrePrefixes.cellMolten, new BW_MetaGenerated_Items(OrePrefixes.cellMolten));
- if (Forestry.isModLoaded()) WerkstoffLoader.items
- .put(OrePrefixes.capsuleMolten, new BW_MetaGenerated_Items(OrePrefixes.capsuleMolten));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b10000000) != 0) {
- WerkstoffLoader.items.put(plate, new BW_MetaGenerated_Items(plate));
- WerkstoffLoader.items.put(foil, new BW_MetaGenerated_Items(foil));
- WerkstoffLoader.items.put(stick, new BW_MetaGenerated_Items(stick));
- WerkstoffLoader.items.put(stickLong, new BW_MetaGenerated_Items(stickLong));
- WerkstoffLoader.items.put(toolHeadWrench, new BW_MetaGenerated_Items(toolHeadWrench));
- WerkstoffLoader.items.put(toolHeadHammer, new BW_MetaGenerated_Items(toolHeadHammer));
- WerkstoffLoader.items.put(toolHeadSaw, new BW_MetaGenerated_Items(toolHeadSaw));
- WerkstoffLoader.items.put(turbineBlade, new BW_MetaGenerated_Items(turbineBlade));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b100000000) != 0) {
- WerkstoffLoader.items.put(gearGt, new BW_MetaGenerated_Items(gearGt));
- WerkstoffLoader.items.put(gearGtSmall, new BW_MetaGenerated_Items(gearGtSmall));
- WerkstoffLoader.items.put(bolt, new BW_MetaGenerated_Items(bolt));
- WerkstoffLoader.items.put(screw, new BW_MetaGenerated_Items(screw));
- WerkstoffLoader.items.put(ring, new BW_MetaGenerated_Items(ring));
- WerkstoffLoader.items.put(spring, new BW_MetaGenerated_Items(spring));
- WerkstoffLoader.items.put(springSmall, new BW_MetaGenerated_Items(springSmall));
- WerkstoffLoader.items.put(rotor, new BW_MetaGenerated_Items(rotor));
- WerkstoffLoader.items.put(wireFine, new BW_MetaGenerated_Items(wireFine));
- }
- if ((WerkstoffLoader.toGenerateGlobal & 0b1000000000) != 0) {
- WerkstoffLoader.items.put(plateDouble, new BW_MetaGenerated_Items(plateDouble));
- WerkstoffLoader.items.put(plateTriple, new BW_MetaGenerated_Items(plateTriple));
- WerkstoffLoader.items.put(plateQuadruple, new BW_MetaGenerated_Items(plateQuadruple));
- WerkstoffLoader.items.put(plateQuintuple, new BW_MetaGenerated_Items(plateQuintuple));
- WerkstoffLoader.items.put(plateDense, new BW_MetaGenerated_Items(plateDense));
- WerkstoffLoader.items.put(ingotDouble, new BW_MetaGenerated_Items(ingotDouble));
- WerkstoffLoader.items.put(ingotTriple, new BW_MetaGenerated_Items(ingotTriple));
- WerkstoffLoader.items.put(ingotQuadruple, new BW_MetaGenerated_Items(ingotQuadruple));
- WerkstoffLoader.items.put(ingotQuintuple, new BW_MetaGenerated_Items(ingotQuintuple));
- }
- ENABLED_ORE_PREFIXES.addAll(WerkstoffLoader.items.keySet());
- ENABLED_ORE_PREFIXES.add(ore);
- ENABLED_ORE_PREFIXES.add(oreSmall);
- WerkstoffLoader.runGTItemDataRegistrator();
- }
-
- static void gameRegistryHandler() {
- if (SideReference.Side.Client) BW_Renderer_Block_Ores.register();
-
- GameRegistry.registerTileEntity(BW_MetaGeneratedOreTE.class, "bw.blockoresTE");
- GameRegistry.registerTileEntity(BW_MetaGeneratedSmallOreTE.class, "bw.blockoresSmallTE");
- GameRegistry.registerTileEntity(BW_MetaGenerated_WerkstoffBlock_TE.class, "bw.werkstoffblockTE");
- GameRegistry.registerTileEntity(BW_MetaGeneratedBlocks_Casing_TE.class, "bw.werkstoffblockcasingTE");
- GameRegistry
- .registerTileEntity(BW_MetaGeneratedBlocks_CasingAdvanced_TE.class, "bw.werkstoffblockscasingadvancedTE");
-
- WerkstoffLoader.BWOres = new BW_MetaGenerated_Ores(Material.rock, BW_MetaGeneratedOreTE.class, "bw.blockores");
- WerkstoffLoader.BWSmallOres = new BW_MetaGenerated_SmallOres(
- Material.rock,
- BW_MetaGeneratedSmallOreTE.class,
- "bw.blockoresSmall");
- WerkstoffLoader.BWBlocks = new BW_MetaGenerated_WerkstoffBlocks(
- Material.iron,
- BW_MetaGenerated_WerkstoffBlock_TE.class,
- "bw.werkstoffblocks");
- WerkstoffLoader.BWBlockCasings = new BW_MetaGeneratedBlocks_Casing(
- Material.iron,
- BW_MetaGeneratedBlocks_Casing_TE.class,
- "bw.werkstoffblockscasing",
- OrePrefixes.blockCasing);
- WerkstoffLoader.BWBlockCasingsAdvanced = new BW_MetaGeneratedBlocks_Casing(
- Material.iron,
- BW_MetaGeneratedBlocks_CasingAdvanced_TE.class,
- "bw.werkstoffblockscasingadvanced",
- OrePrefixes.blockCasingAdvanced);
-
- GameRegistry.registerBlock(WerkstoffLoader.BWOres, BW_MetaGeneratedBlock_Item.class, "bw.blockores.01");
- GameRegistry.registerBlock(WerkstoffLoader.BWSmallOres, BW_MetaGeneratedBlock_Item.class, "bw.blockores.02");
- GameRegistry.registerBlock(WerkstoffLoader.BWBlocks, BW_MetaGeneratedBlock_Item.class, "bw.werkstoffblocks.01");
- if (!ConfigHandler.disableBoltedBlocksCasing) GameRegistry.registerBlock(
- WerkstoffLoader.BWBlockCasings,
- BW_MetaGeneratedBlock_Item.class,
- "bw.werkstoffblockscasing.01");
- if (!ConfigHandler.disableReboltedBlocksCasing) GameRegistry.registerBlock(
- WerkstoffLoader.BWBlockCasingsAdvanced,
- BW_MetaGeneratedBlock_Item.class,
- "bw.werkstoffblockscasingadvanced.01");
-
- GTMetaItemEnhancer.addAdditionalOreDictToForestry();
- GTMetaItemEnhancer.init();
- }
-
- private static void runGTItemDataRegistrator() {
- IWerkstoffRunnable[] registrations = { new BridgeMaterialsLoader(), new AssociationLoader(),
- new CasingRegistrator() };
- for (Werkstoff werkstoff : Werkstoff.werkstoffHashSet) {
- for (IWerkstoffRunnable registration : registrations) {
- registration.run(werkstoff);
- }
- }
- addFakeItemDataToInWorldBlocksAndCleanUpFakeData();
- addVanillaCasingsToGTOreDictUnificator();
- }
-
- public static void addVanillaCasingsToGTOreDictUnificator() {
- GT_OreDictUnificator
- .addAssociation(OrePrefixes.blockCasing, Materials.Aluminium, ItemList.Casing_FrostProof.get(1L), false);
- GT_OreDictUnificator
- .addAssociation(OrePrefixes.blockCasing, Materials.Nickel, ItemList.Casing_HeatProof.get(1L), false);
- GT_OreDictUnificator
- .addAssociation(OrePrefixes.blockCasing, Materials.Lead, ItemList.Casing_RadiationProof.get(1L), false);
- GT_OreDictUnificator
- .addAssociation(OrePrefixes.blockCasing, Materials.Steel, ItemList.Casing_SolidSteel.get(1L), false);
- GT_OreDictUnificator.addAssociation(
- OrePrefixes.blockCasing,
- Materials.TungstenSteel,
- ItemList.Casing_RobustTungstenSteel.get(1L),
- false);
- GT_OreDictUnificator.addAssociation(
- OrePrefixes.blockCasing,
- Materials.Polytetrafluoroethylene,
- ItemList.Casing_Chemically_Inert.get(1L),
- false);
- }
-
- /**
- * very hacky way to make my ores/blocks/smallores detectable by gt assosication in world, well at least the prefix.
- * used for the miners mostly removing this hacky material from the materials map instantly. we only need the item
- * data.
- */
- @SuppressWarnings("unchecked")
- private static void addFakeItemDataToInWorldBlocksAndCleanUpFakeData() {
-
- Map<String, Materials> MATERIALS_MAP = null;
-
- try {
- Field f = Materials.class.getDeclaredField("MATERIALS_MAP");
- f.setAccessible(true);
- MATERIALS_MAP = (Map<String, Materials>) f.get(null);
- } catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) {
- e.printStackTrace();
- }
-
- if (MATERIALS_MAP == null) throw new NullPointerException("MATERIALS_MAP null!");
-
- Materials oreMat = new Materials(-1, null, 0, 0, 0, false, "bwores", "bwores", null, true, null);
- Materials smallOreMat = new Materials(-1, null, 0, 0, 0, false, "bwsmallores", "bwsmallores", null, true, null);
- Materials blockMat = new Materials(-1, null, 0, 0, 0, false, "bwblocks", "bwblocks", null, true, null);
-
- for (int i = 0; i < 16; i++) {
- GT_OreDictUnificator.addAssociation(ore, oreMat, new ItemStack(BWOres, 1, i), true);
- GT_OreDictUnificator.addAssociation(oreSmall, smallOreMat, new ItemStack(BWSmallOres, 1, i), true);
- GT_OreDictUnificator.addAssociation(block, blockMat, new ItemStack(BWBlocks, 1, i), true);
- }
-
- MATERIALS_MAP.remove("bwores");
- MATERIALS_MAP.remove("bwsmallores");
- MATERIALS_MAP.remove("bwblocks");
- }
-
- public static void removeIC2Recipes() {
- try {
- Set<Map.Entry<IRecipeInput, RecipeOutput>> remset = new HashSet<>();
- for (Map.Entry<IRecipeInput, RecipeOutput> curr : Recipes.macerator.getRecipes()
- .entrySet()) {
- if (curr.getKey() instanceof RecipeInputOreDict) {
- if ("oreNULL".equalsIgnoreCase(((RecipeInputOreDict) curr.getKey()).input)) {
- remset.add(curr);
- }
- for (ItemStack stack : curr.getValue().items) {
- if (stack.getItem() instanceof BW_MetaGenerated_Items) remset.add(curr);
- }
- }
- }
- Recipes.macerator.getRecipes()
- .entrySet()
- .removeAll(remset);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- private static void runAdditionalOreDict() {
- for (Werkstoff werkstoff : Werkstoff.werkstoffHashSet) {
- if (werkstoff.hasItemType(ore)) {
- GT_OreDictUnificator.registerOre(ore + werkstoff.getVarName(), werkstoff.get(ore));
- GT_OreDictUnificator.registerOre(oreSmall + werkstoff.getVarName(), werkstoff.get(oreSmall));
- werkstoff.getADDITIONAL_OREDICT()
- .forEach(e -> OreDictionary.registerOre(ore + e, werkstoff.get(ore)));
- werkstoff.getADDITIONAL_OREDICT()
- .forEach(e -> OreDictionary.registerOre(oreSmall + e, werkstoff.get(oreSmall)));
- }
-
- if (werkstoff.hasItemType(gem)) OreDictionary.registerOre(
- "craftingLens" + BW_ColorUtil.getDyeFromColor(werkstoff.getRGBA()).mName.replace(" ", ""),
- werkstoff.get(lens));
-
- if (werkstoff.hasItemType(gem) || werkstoff.hasItemType(ingot)) {
- GT_OreDictUnificator.registerOre(block + werkstoff.getVarName(), werkstoff.get(block));
- werkstoff.getADDITIONAL_OREDICT()
- .forEach(e -> OreDictionary.registerOre(block + e, werkstoff.get(block)));
- }
-
- werkstoff.getADDITIONAL_OREDICT()
- .forEach(
- s -> ENABLED_ORE_PREFIXES.stream()
- .filter(o -> Objects.nonNull(werkstoff.get(o)))
- .forEach(od -> OreDictionary.registerOre(od + s, werkstoff.get(od))));
- }
-
- GT_OreDictUnificator.registerOre("craftingIndustrialDiamond", WerkstoffLoader.CubicZirconia.get(gemExquisite));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java
deleted file mode 100644
index c31013eb78..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.processingLoaders;
-
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-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 com.github.bartimaeusnek.bartworks.system.material.BW_NonMeta_MaterialItems;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-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_OreDictUnificator;
-
-public class AddSomeRecipes implements Runnable {
-
- public void run() {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(BW_NonMeta_MaterialItems.Depleted_Tiberium_1.get(1))
- .itemOutputs(
- WerkstoffLoader.Zirconium.get(dust),
- WerkstoffLoader.Zirconium.get(dust),
- WerkstoffLoader.Tiberium.get(dustSmall, 2),
- WerkstoffLoader.Zirconium.get(dust, 2),
- GT_OreDictUnificator.get(dust, Materials.TungstenSteel, 8L),
- GT_OreDictUnificator.get(dust, Materials.Platinum, 1L))
- .outputChances(100_00, 50_00, 50_00, 25_00, 100_00, 100_00)
- .fluidOutputs(WerkstoffLoader.Xenon.getFluidOrGas(1))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_EV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(BW_NonMeta_MaterialItems.Depleted_Tiberium_2.get(1))
- .itemOutputs(
- WerkstoffLoader.Zirconium.get(dust, 2),
- WerkstoffLoader.Zirconium.get(dust, 2),
- WerkstoffLoader.Tiberium.get(dust),
- WerkstoffLoader.Zirconium.get(dust, 4),
- GT_OreDictUnificator.get(dust, Materials.TungstenSteel, 18L),
- GT_OreDictUnificator.get(dust, Materials.Platinum, 2L))
- .outputChances(100_00, 50_00, 50_00, 25_00, 100_00, 100_00)
- .fluidOutputs(WerkstoffLoader.Xenon.getFluidOrGas(2))
- .duration(12 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_EV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(BW_NonMeta_MaterialItems.Depleted_Tiberium_4.get(1))
- .itemOutputs(
- WerkstoffLoader.Zirconium.get(dust, 4),
- WerkstoffLoader.Zirconium.get(dust, 4),
- WerkstoffLoader.Tiberium.get(dust, 2),
- WerkstoffLoader.Zirconium.get(dust, 8),
- GT_OreDictUnificator.get(dust, Materials.TungstenSteel, 38L),
- GT_OreDictUnificator.get(dust, Materials.Platinum, 4L))
- .outputChances(100_00, 50_00, 50_00, 25_00, 100_00, 100_00)
- .fluidOutputs(WerkstoffLoader.Xenon.getFluidOrGas(4))
- .duration(50 * SECONDS)
- .eut(TierEU.RECIPE_EV)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(BW_NonMeta_MaterialItems.Depleted_TheCoreCell.get(1))
- .itemOutputs(
- ItemList.Depleted_Naquadah_4.get(8),
- WerkstoffLoader.Zirconium.get(dust, 64),
- WerkstoffLoader.Zirconium.get(dust, 64),
- GT_OreDictUnificator.get(dust, Materials.TungstenSteel, 64L),
- GT_OreDictUnificator.get(dust, Materials.TungstenSteel, 64L),
- GT_OreDictUnificator.get(dust, Materials.TungstenSteel, 48L))
- .outputChances(100_00, 50_00, 50_00, 100_00, 100_00, 100_00)
- .duration(1 * MINUTES + 40 * SECONDS)
- .eut(TierEU.RECIPE_IV)
- .addTo(centrifugeRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java
deleted file mode 100644
index 3638536ca6..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java
+++ /dev/null
@@ -1,671 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.processingLoaders;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.CLEANROOM;
-import static gregtech.api.enums.Mods.Gendustry;
-import static gregtech.api.enums.OrePrefixes.bolt;
-import static gregtech.api.enums.OrePrefixes.crushed;
-import static gregtech.api.enums.OrePrefixes.crushedPurified;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.gemChipped;
-import static gregtech.api.enums.OrePrefixes.gemExquisite;
-import static gregtech.api.enums.OrePrefixes.gemFlawed;
-import static gregtech.api.enums.OrePrefixes.stick;
-import static gregtech.api.enums.OrePrefixes.stickLong;
-import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.recipe.RecipeMaps.primitiveBlastRecipes;
-import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
-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 java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-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 org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioCultureLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-import com.github.bartimaeusnek.bartworks.common.loaders.FluidLoader;
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.BW_NonMeta_MaterialItems;
-import com.github.bartimaeusnek.bartworks.system.material.CircuitGeneration.BW_Meta_Items;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.BioCulture;
-import com.github.bartimaeusnek.bartworks.util.BioDNA;
-import com.github.bartimaeusnek.bartworks.util.BioData;
-import com.github.bartimaeusnek.bartworks.util.BioPlasmid;
-
-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.TierEU;
-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_RecipeConstants;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.items.behaviors.Behaviour_DataOrb;
-
-public class AdditionalRecipes {
-
- private static void runBWRecipes() {
-
- if (ConfigHandler.BioLab) {
- FluidStack[] dnaFluid = { Gendustry.isModLoaded() ? FluidRegistry.getFluidStack("liquiddna", 1000)
- : Materials.Biomass.getFluid(1000L) };
-
- for (ItemStack stack : BioItemList.getAllPetriDishes()) {
- BioData DNA = BioData.getBioDataFromNBTTag(
- stack.getTagCompound()
- .getCompoundTag("DNA"));
- if (DNA != null) {
- ItemStack Detergent = BioItemList.getOther(1);
- ItemStack DNAFlask = BioItemList.getDNASampleFlask(null);
- ItemStack EthanolCell = Materials.Ethanol.getCells(1);
- BartWorksRecipeMaps.bioLabRecipes.addFakeRecipe(
- false,
- new ItemStack[] { stack, DNAFlask, Detergent, EthanolCell },
- new ItemStack[] { BioItemList.getDNASampleFlask(BioDNA.convertDataToDNA(DNA)),
- GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L) },
- BioItemList.mBioLabParts[0],
- new int[] { DNA.getChance(), 10000 },
- new FluidStack[] { FluidRegistry.getFluidStack("ic2distilledwater", 1000) },
- null,
- 500,
- BW_Util.getMachineVoltageFromTier(3 + DNA.getTier()),
- BW_Util.STANDART);
- }
- }
-
- for (ItemStack stack : BioItemList.getAllDNASampleFlasks()) {
- BioData DNA = BioData.getBioDataFromNBTTag(stack.getTagCompound());
-
- if (DNA != null) {
- ItemStack Outp = ItemList.Tool_DataOrb.get(1L);
- Behaviour_DataOrb.setDataTitle(Outp, "DNA Sample");
- Behaviour_DataOrb.setDataName(Outp, DNA.getName());
-
- BartWorksRecipeMaps.bioLabRecipes.addFakeRecipe(
- false,
- new ItemStack[] { stack, FluidLoader.BioLabFluidCells[0], FluidLoader.BioLabFluidCells[3],
- ItemList.Tool_DataOrb.get(1L) },
- new ItemStack[] { Outp, ItemList.Cell_Empty.get(2L) },
- BioItemList.mBioLabParts[1],
- new int[] { DNA.getChance(), 10000 },
- dnaFluid,
- null,
- 500,
- BW_Util.getMachineVoltageFromTier(4 + DNA.getTier()),
- BW_Util.STANDART);
- }
- }
-
- for (ItemStack stack : BioItemList.getAllPlasmidCells()) {
- BioData DNA = BioData.getBioDataFromNBTTag(stack.getTagCompound());
-
- if (DNA != null) {
- ItemStack inp = ItemList.Tool_DataOrb.get(0L);
- Behaviour_DataOrb.setDataTitle(inp, "DNA Sample");
- Behaviour_DataOrb.setDataName(inp, DNA.getName());
- ItemStack inp2 = ItemList.Tool_DataOrb.get(0L);
- Behaviour_DataOrb.setDataTitle(inp2, "DNA Sample");
- Behaviour_DataOrb.setDataName(inp2, BioCultureLoader.BIO_DATA_BETA_LACMATASE.getName());
-
- BartWorksRecipeMaps.bioLabRecipes.addFakeRecipe(
- false,
- new ItemStack[] { FluidLoader.BioLabFluidCells[1], BioItemList.getPlasmidCell(null), inp,
- inp2 },
- new ItemStack[] { stack, ItemList.Cell_Empty.get(1L) },
- BioItemList.mBioLabParts[2],
- new int[] { DNA.getChance(), 10000 },
- dnaFluid,
- null,
- 500,
- BW_Util.getMachineVoltageFromTier(4 + DNA.getTier()),
- BW_Util.STANDART);
- }
- }
-
- for (ItemStack stack : BioItemList.getAllPetriDishes()) {
- BioData DNA = BioData.getBioDataFromNBTTag(
- stack.getTagCompound()
- .getCompoundTag("DNA"));
- BioData Plasmid = BioData.getBioDataFromNBTTag(
- stack.getTagCompound()
- .getCompoundTag("Plasmid"));
- if (!Objects.equals(DNA.getName(), Plasmid.getName())) {
- BartWorksRecipeMaps.bioLabRecipes.addFakeRecipe(
- true,
- new ItemStack[] { BioItemList.getPetriDish(BioCulture.getBioCulture(DNA.getName())),
- BioItemList.getPlasmidCell(BioPlasmid.convertDataToPlasmid(Plasmid)),
- FluidLoader.BioLabFluidCells[2], },
- new ItemStack[] { stack, ItemList.Cell_Empty.get(1L) },
- BioItemList.mBioLabParts[3],
- new int[] { Plasmid.getChance(), 10000 },
- new FluidStack[] { FluidRegistry.getFluidStack("ic2distilledwater", 1000) },
- null,
- 500,
- (int) TierEU.RECIPE_LuV,
- BW_Util.STANDART);
- }
- }
-
- ItemStack Outp = ItemList.Tool_DataOrb.get(1L);
- Behaviour_DataOrb.setDataTitle(Outp, "DNA Sample");
- Behaviour_DataOrb.setDataName(Outp, "Any DNA");
- // Clonal Cellular Synthesis- [Liquid DNA] + Medium Petri Dish + Plasma Membrane + Stem Cells + Genome Data
- BartWorksRecipeMaps.bioLabRecipes.addFakeRecipe(
- false,
- new ItemStack[] { BioItemList.getPetriDish(null), BioItemList.getOther(4),
- ItemList.Circuit_Chip_Stemcell.get(2L), Outp },
- new ItemStack[] { BioItemList.getPetriDish(null)
- .setStackDisplayName("The Culture made from DNA"), },
- BioItemList.mBioLabParts[4],
- new int[] { 7500, 10000 },
- new FluidStack[] { new FluidStack(dnaFluid[0].getFluid(), 8000) },
- null,
- 500,
- (int) TierEU.RECIPE_LuV,
- BW_Util.STANDART);
-
- FluidStack[] easyFluids = { Materials.Water.getFluid(1000L),
- FluidRegistry.getFluidStack("ic2distilledwater", 1000) };
- for (FluidStack fluidStack : easyFluids) {
- for (BioCulture bioCulture : BioCulture.BIO_CULTURE_ARRAY_LIST) {
- if (bioCulture.isBreedable() && bioCulture.getTier() == 0) {
- BartWorksRecipeMaps.bacterialVatRecipes.addRecipe(
- // boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems,
- // int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration,
- // int aEUt, int aSpecialValue
- new GT_Recipe(
- true,
- new ItemStack[] { GT_Utility.getIntegratedCircuit(1), new ItemStack(Items.sugar, 64) },
- null,
- BioItemList.getPetriDish(bioCulture),
- null,
- new FluidStack[] { fluidStack },
- new FluidStack[] { new FluidStack(bioCulture.getFluid(), 10) },
- 1000,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART));
- // aOptimize, aInputs, aOutputs, aSpecialItems, aChances, aFluidInputs, aFluidOutputs,
- // aDuration, aEUt, aSpecialValue
- BartWorksRecipeMaps.bioLabRecipes.addRecipe(
- new GT_Recipe(
- false,
- new ItemStack[] { BioItemList.getPetriDish(null),
- fluidStack.equals(Materials.Water.getFluid(1000L)) ? Materials.Water.getCells(1)
- : GT_Utility.getContainersFromFluid(GT_ModHandler.getDistilledWater(1000))
- .get(0) },
- new ItemStack[] { BioItemList.getPetriDish(bioCulture), Materials.Empty.getCells(1) },
- null,
- new int[] { bioCulture.getChance(), 10000 },
- new FluidStack[] { new FluidStack(bioCulture.getFluid(), 1000) },
- null,
- 500,
- (int) TierEU.RECIPE_HV,
- BW_Util.STANDART));
- }
- }
- }
- }
-
- List<Pair<Materials, Integer>> liquidFuels = Arrays.asList(
- ImmutablePair.of(Materials.PhosphoricAcid, 36),
- ImmutablePair.of(Materials.DilutedHydrochloricAcid, 14),
- ImmutablePair.of(Materials.HypochlorousAcid, 30),
- ImmutablePair.of(Materials.HydrofluoricAcid, 40),
- ImmutablePair.of(Materials.HydrochloricAcid, 28),
- ImmutablePair.of(Materials.NitricAcid, 24),
- ImmutablePair.of(Materials.Mercury, 32),
- ImmutablePair.of(Materials.DilutedSulfuricAcid, 9),
- ImmutablePair.of(Materials.SulfuricAcid, 18),
- ImmutablePair.of(Materials.AceticAcid, 11),
- ImmutablePair.of(WerkstoffLoader.FormicAcid.getBridgeMaterial(), 40));
- for (Pair<Materials, Integer> fuel : liquidFuels) {
- GT_Values.RA.stdBuilder()
- .itemInputs(
- fuel.getLeft()
- .getCells(1))
- .itemOutputs(Materials.Empty.getCells(1))
- .metadata(GT_RecipeConstants.FUEL_VALUE, fuel.getRight())
- .addTo(BartWorksRecipeMaps.acidGenFuels);
- }
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Redstone, 1))
- .itemOutputs(Materials.Empty.getCells(1))
- .metadata(GT_RecipeConstants.FUEL_VALUE, 10)
- .addTo(BartWorksRecipeMaps.acidGenFuels);
- }
-
- @SuppressWarnings("deprecation")
- public static void run() {
- runBWRecipes();
- GT_Values.RA.addImplosionRecipe(
- WerkstoffLoader.RawAdemicSteel.get(dust),
- 4,
- WerkstoffLoader.AdemicSteel.get(dust),
- null);
- // Thorium/Yttrium Glas
- GT_Values.RA.addBlastRecipe(
- WerkstoffLoader.YttriumOxide.get(dustSmall, 2),
- WerkstoffLoader.Thorianit.get(dustSmall, 2),
- Materials.Glass.getMolten(144),
- null,
- new ItemStack(ItemRegistry.bw_glasses[0], 1, 12),
- null,
- 800,
- (int) TierEU.RECIPE_IV,
- 3663);
- // Thorianite recipes
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.Thorianit.get(crushedPurified))
- .itemOutputs(
- WerkstoffLoader.Thorianit.get(dust),
- WerkstoffLoader.Thorianit.get(dust),
- WerkstoffLoader.Thorianit.get(dust),
- Materials.Thorium.getDust(1),
- Materials.Thorium.getDust(1),
- WerkstoffLoader.Thorium232.get(dust))
- .outputChances(7000, 1300, 700, 600, 300, 100)
- .duration(20 * SECONDS)
- .eut((int) TierEU.RECIPE_IV)
- .addTo(sifterRecipes);
-
- // 3ThO2 + 4Al = 3Th + 2Al2O3
- GT_Values.RA.addChemicalRecipe(
- WerkstoffLoader.Thorianit.get(dust, 9),
- Materials.Aluminium.getDust(4),
- null,
- null,
- Materials.Thorium.getDust(3),
- Materials.Aluminiumoxide.getDust(10),
- 1000);
- // ThO2 + 2Mg = Th + 2MgO
- GT_Values.RA.addChemicalRecipe(
- WerkstoffLoader.Thorianit.get(dust, 3),
- Materials.Magnesium.getDust(2),
- null,
- null,
- Materials.Thorium.getDust(1),
- Materials.Magnesia.getDust(4),
- 1000);
- GT_Values.RA.addChemicalRecipe(
- WerkstoffLoader.Thorianit.get(crushed),
- ItemList.Crop_Drop_Thorium.get(9),
- Materials.Water.getFluid(1000),
- Materials.Thorium.getMolten(144),
- WerkstoffLoader.Thorianit.get(crushedPurified, 4),
- 96,
- 24);
-
- // Prasiolite
- GT_Values.RA.addBlastRecipe(
- GT_OreDictUnificator.get(dust, Materials.Quartzite, 40L),
- Materials.Amethyst.getDust(10),
- GT_Values.NF,
- GT_Values.NF,
- WerkstoffLoader.Prasiolite.get(OrePrefixes.gemFlawed, 20),
- GT_Values.NI,
- 800,
- (int) TierEU.RECIPE_MV,
- 500);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_OreDictUnificator.get(dust, Materials.Quartzite, 40L))
- .itemOutputs(Materials.Amethyst.getDust(10))
- .duration(40 * SECONDS)
- .eut(0)
- .metadata(ADDITIVE_AMOUNT, 6)
- .addTo(primitiveBlastRecipes);
-
- // Cubic Circonia
- // 2Y + 3O = Y2O3
- GT_Values.RA.addChemicalRecipe(
- Materials.Yttrium.getDust(2),
- GT_Utility.getIntegratedCircuit(5),
- Materials.Oxygen.getGas(3000),
- GT_Values.NF,
- WerkstoffLoader.YttriumOxide.get(dust, 5),
- 4096,
- (int) TierEU.RECIPE_LV);
- // Zr + 2O =Y22O3= ZrO2
- RecipeMaps.blastFurnaceRecipes.addRecipe(
- false,
- new ItemStack[] { WerkstoffLoader.Zirconium.get(dust, 10), WerkstoffLoader.YttriumOxide.get(dust, 0) },
- new ItemStack[] { WerkstoffLoader.CubicZirconia.get(gemFlawed, 40) },
- null,
- null,
- new FluidStack[] { Materials.Oxygen.getGas(20000) },
- null,
- 57600,
- (int) TierEU.RECIPE_HV,
- 2953);
- // Tellurium
- GT_Values.RA.addBlastRecipe(
- GT_OreDictUnificator.get(crushed, Materials.Lead, 10L),
- GT_Utility.getIntegratedCircuit(17),
- GT_Values.NF,
- GT_Values.NF,
- Materials.Lead.getIngots(10),
- Materials.Tellurium.getNuggets(20),
- 800,
- (int) TierEU.RECIPE_MV,
- 722);
- GT_Values.RA.addFusionReactorRecipe(
- Materials.Plutonium.getMolten(48),
- Materials.Beryllium.getMolten(48),
- WerkstoffLoader.Californium.getMolten(48),
- 240,
- 49152,
- 480000000);
- GT_Values.RA.addFusionReactorRecipe(
- WerkstoffLoader.Californium.getMolten(32),
- WerkstoffLoader.Calcium.getMolten(720),
- WerkstoffLoader.Oganesson.getFluidOrGas(720),
- 420,
- 49152,
- 600000000);
- GT_Values.RA.addDistillationTowerRecipe(
- Materials.LiquidAir.getFluid(100000000),
- new FluidStack[] { Materials.Nitrogen.getGas(78084000), Materials.Oxygen.getGas(20946000),
- Materials.Argon.getGas(934000), Materials.CarbonDioxide.getGas(40700),
- WerkstoffLoader.Neon.getFluidOrGas(1818), Materials.Helium.getGas(524), Materials.Methane.getGas(180),
- WerkstoffLoader.Krypton.getFluidOrGas(114), Materials.Hydrogen.getGas(55),
- WerkstoffLoader.Xenon.getFluidOrGas(9) },
- null,
- 7500,
- (int) TierEU.RECIPE_EV);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.MagnetoResonaticDust.get(dust))
- .itemOutputs(WerkstoffLoader.MagnetoResonaticDust.get(gemChipped, 9))
- .outputChances(90_00)
- .fluidInputs(WerkstoffLoader.Neon.getFluidOrGas(1000))
- .duration(3 * MINUTES + 45 * SECONDS)
- .eut(TierEU.RECIPE_IV)
- .addTo(autoclaveRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(WerkstoffLoader.MagnetoResonaticDust.get(dust))
- .itemOutputs(WerkstoffLoader.MagnetoResonaticDust.get(gem))
- .fluidInputs(WerkstoffLoader.Krypton.getFluidOrGas(1000))
- .duration(3 * MINUTES + 45 * SECONDS)
- .eut(TierEU.RECIPE_IV)
- .addTo(autoclaveRecipes);
-
- // Milk
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(
- Materials.Sugar.getDustSmall(21),
- Materials.Calcium.getDustTiny(1),
- Materials.Magnesium.getDustTiny(1),
- Materials.Potassium.getDustTiny(1),
- Materials.Sodium.getDustTiny(4),
- Materials.Phosphor.getDustTiny(1))
- .outputChances(100_00, 100_00, 10_00, 100_00, 10_00, 10_00)
- .fluidInputs(Materials.Milk.getFluid(10000))
- .fluidOutputs(Materials.Water.getFluid(8832))
- .duration(2 * SECONDS + 10 * TICKS)
- .eut(TierEU.RECIPE_MV)
- .addTo(centrifugeRecipes);
-
- // Magneto Resonatic Circuits
-
- Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
- ? FluidRegistry.getFluid("molten.indalloy140")
- : FluidRegistry.getFluid("molten.solderingalloy");
-
- Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
- ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
- : FluidRegistry.getFluid("molten.solderingalloy");
- // ULV
- RecipeMaps.circuitAssemblerRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3), WerkstoffLoader.MagnetoResonaticDust.get(gem), ItemList.NandChip.get(1),
- ItemList.Circuit_Parts_DiodeSMD.get(4), ItemList.Circuit_Parts_CapacitorSMD.get(4),
- ItemList.Circuit_Parts_TransistorSMD.get(4) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(4) },
- null,
- null,
- new FluidStack[] { Materials.SolderingAlloy.getMolten(36) },
- null,
- 750,
- (int) TierEU.RECIPE_LV,
- CLEANROOM));
- // LV-EV
- for (int i = 1; i <= 4; i++) {
- RecipeMaps.circuitAssemblerRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3), WerkstoffLoader.MagnetoResonaticDust.get(gem),
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(i + 3),
- ItemList.Circuit_Parts_DiodeSMD.get((i + 1) * 4),
- ItemList.Circuit_Parts_CapacitorSMD.get((i + 1) * 4),
- ItemList.Circuit_Parts_TransistorSMD.get((i + 1) * 4) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(i + 4) },
- null,
- null,
- new FluidStack[] { Materials.SolderingAlloy.getMolten((i + 1) * 36) },
- null,
- (i + 1) * 750,
- BW_Util.getMachineVoltageFromTier(i + 1),
- CLEANROOM));
- }
- // IV-LuV
- for (int i = 5; i <= 6; i++) {
- RecipeMaps.circuitAssemblerRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3), WerkstoffLoader.MagnetoResonaticDust.get(gem),
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(i + 3),
- ItemList.Circuit_Parts_DiodeASMD.get((i + 1) * 4),
- ItemList.Circuit_Parts_CapacitorASMD.get((i + 1) * 4),
- ItemList.Circuit_Parts_TransistorASMD.get((i + 1) * 4) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(i + 4) },
- null,
- null,
- new FluidStack[] { new FluidStack(solderIndalloy, (i + 1) * 36) },
- null,
- (i + 1) * 750,
- BW_Util.getMachineVoltageFromTier(i + 1),
- CLEANROOM));
- }
- // ZPM
- RecipeMaps.circuitAssemblerRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3), WerkstoffLoader.MagnetoResonaticDust.get(gemExquisite, 1),
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(7 + 3),
- ItemList.Circuit_Parts_DiodeASMD.get((7 + 6) * 4),
- ItemList.Circuit_Parts_CapacitorASMD.get((7 + 6) * 4),
- ItemList.Circuit_Parts_TransistorASMD.get((7 + 6) * 4) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(7 + 4) },
- null,
- null,
- new FluidStack[] { new FluidStack(solderIndalloy, (7 + 1) * 36) },
- null,
- (7 + 1) * 1500,
- BW_Util.getMachineVoltageFromTier(7 + 1),
- CLEANROOM));
- // UV
- RecipeMaps.circuitAssemblerRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3), WerkstoffLoader.MagnetoResonaticDust.get(gemExquisite, 1),
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(8 + 3),
- ItemList.Circuit_Parts_DiodeASMD.get((8 + 6) * 4),
- ItemList.Circuit_Parts_CapacitorASMD.get((8 + 6) * 4),
- ItemList.Circuit_Parts_TransistorASMD.get((8 + 6) * 4) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(8 + 4) },
- null,
- null,
- new FluidStack[] { new FluidStack(solderUEV, (8 + 1) * 36) },
- null,
- (8 + 1) * 1500,
- BW_Util.getMachineVoltageFromTier(8 + 1),
- CLEANROOM));
- // UHV-UEV
- for (int i = 9; i <= 10; i++) {
- RecipeMaps.circuitAssemblerRecipes.add(
- new GT_Recipe(
- false,
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(3), WerkstoffLoader.MagnetoResonaticDust.get(gemExquisite, 1),
- BW_Meta_Items.getNEWCIRCUITS()
- .getStack(i + 3),
- ItemList.Circuit_Parts_DiodeXSMD.get((i + 6) * 4),
- ItemList.Circuit_Parts_CapacitorXSMD.get((i + 6) * 4),
- ItemList.Circuit_Parts_TransistorXSMD.get((i + 6) * 4) },
- new ItemStack[] { BW_Meta_Items.getNEWCIRCUITS()
- .getStack(i + 4) },
- null,
- null,
- new FluidStack[] { new FluidStack(solderUEV, (i + 1) * 36) },
- null,
- (i + 1) * 1500,
- BW_Util.getMachineVoltageFromTier(i + 1),
- CLEANROOM));
- }
- RecipeMaps.smallNaquadahReactorFuels.addRecipe(
- true,
- new ItemStack[] { WerkstoffLoader.Tiberium.get(bolt) },
- new ItemStack[] {},
- null,
- null,
- null,
- 0,
- 0,
- 12500);
- RecipeMaps.largeNaquadahReactorFuels.addRecipe(
- true,
- new ItemStack[] { WerkstoffLoader.Tiberium.get(stick) },
- new ItemStack[] {},
- null,
- null,
- null,
- 0,
- 0,
- 62500);
-
- RecipeMaps.hugeNaquadahReactorFuels.addRecipe(
- true,
- new ItemStack[] { WerkstoffLoader.Tiberium.get(stickLong) },
- new ItemStack[] {},
- null,
- null,
- null,
- 0,
- 0,
- 125000);
- RecipeMaps.extremeNaquadahReactorFuels.addRecipe(
- true,
- new ItemStack[] { WerkstoffLoader.Tiberium.get(stick) },
- new ItemStack[] {},
- null,
- null,
- null,
- 0,
- 0,
- 31250);
- RecipeMaps.ultraHugeNaquadahReactorFuels.addRecipe(
- true,
- new ItemStack[] { WerkstoffLoader.Tiberium.get(stickLong) },
- new ItemStack[] {},
- null,
- null,
- null,
- 0,
- 0,
- 125000);
-
- LoadItemContainers.run();
-
- GT_Values.RA.addCannerRecipe(
- ItemList.Large_Fluid_Cell_TungstenSteel.get(1L),
- WerkstoffLoader.Tiberium.get(dust, 3),
- BW_NonMeta_MaterialItems.TiberiumCell_1.get(1L),
- null,
- 30,
- 16);
- GT_Values.RA.addAssemblerRecipe(
- BW_NonMeta_MaterialItems.TiberiumCell_1.get(2L),
- GT_OreDictUnificator.get(stick, Materials.TungstenSteel, 4L),
- BW_NonMeta_MaterialItems.TiberiumCell_2.get(1L),
- 100,
- 400);
- GT_Values.RA.addAssemblerRecipe(
- BW_NonMeta_MaterialItems.TiberiumCell_1.get(4L),
- GT_OreDictUnificator.get(stickLong, Materials.TungstenSteel, 6L),
- BW_NonMeta_MaterialItems.TiberiumCell_4.get(1L),
- 150,
- 400);
- GT_Values.RA.addAssemblerRecipe(
- BW_NonMeta_MaterialItems.TiberiumCell_2.get(2L),
- GT_OreDictUnificator.get(stick, Materials.TungstenSteel, 4L),
- BW_NonMeta_MaterialItems.TiberiumCell_4.get(1L),
- 100,
- 400);
-
- GT_Values.RA.addAssemblerRecipe(
- new ItemStack[] { ItemList.NaquadahCell_1.get(32L),
- GT_OreDictUnificator.get(stickLong, Materials.TungstenSteel, 64L),
- GT_OreDictUnificator.get(stickLong, Materials.TungstenSteel, 64L),
- GT_OreDictUnificator.get(stickLong, Materials.TungstenSteel, 64L),
- WerkstoffLoader.Tiberium.get(dust, 64), WerkstoffLoader.Tiberium.get(dust, 64) },
- null,
- BW_NonMeta_MaterialItems.TheCoreCell.get(1L),
- 100,
- (int) TierEU.RECIPE_LuV);
-
- GregTech_API.sAfterGTPostload.add(new AddSomeRecipes());
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java
deleted file mode 100644
index f07faa79a8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.processingLoaders;
-
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Util;
-import com.github.bartimaeusnek.bartworks.util.StreamUtils;
-
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_Recipe;
-
-public class DownTierLoader {
-
- public static void run() {
- RecipeMap.ALL_RECIPE_MAPS.values()
- .stream()
- .filter(map -> StreamUtils.filterVisualMaps(map) && map != RecipeMaps.fusionRecipes)
- .forEach(map -> {
- Set<GT_Recipe> newRecipes = new HashSet<>();
- Set<GT_Recipe> toRem = new HashSet<>();
- map.getAllRecipes()
- .stream()
- .filter(recipe -> Objects.nonNull(recipe) && recipe.mEUt > 128)
- .forEach(recipe -> {
- toRem.add(recipe);
- newRecipes.add(BW_Util.copyAndSetTierToNewRecipe(recipe, (byte) 2));
- });
- map.getBackend()
- .removeRecipes(toRem);
- newRecipes.forEach(map::add);
- });
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java
deleted file mode 100644
index 67de5d5f5b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.processingLoaders;
-
-import com.github.bartimaeusnek.bartworks.system.material.BW_NonMeta_MaterialItems;
-
-import gregtech.api.items.GT_RadioactiveCellIC_Item;
-import gregtech.common.items.GT_DepletetCell_Item;
-
-public class LoadItemContainers {
-
- public static void run() {
- BW_NonMeta_MaterialItems.Depleted_Tiberium_1
- .set(new GT_DepletetCell_Item("TiberiumcellDep", "Fuel Rod (Depleted Tiberium)", 1));
- BW_NonMeta_MaterialItems.Depleted_Tiberium_2
- .set(new GT_DepletetCell_Item("Double_TiberiumcellDep", "Dual Fuel Rod (Depleted Tiberium)", 1));
- BW_NonMeta_MaterialItems.Depleted_Tiberium_4
- .set(new GT_DepletetCell_Item("Quad_TiberiumcellDep", "Quad Fuel Rod (Depleted Tiberium)", 1));
- BW_NonMeta_MaterialItems.TiberiumCell_1.set(
- new GT_RadioactiveCellIC_Item(
- "Tiberiumcell",
- "Fuel Rod (Tiberium)",
- 1,
- 50000,
- 2F,
- 1,
- 0.5F,
- BW_NonMeta_MaterialItems.Depleted_Tiberium_1.get(1),
- false));
- BW_NonMeta_MaterialItems.TiberiumCell_2.set(
- new GT_RadioactiveCellIC_Item(
- "Double_Tiberiumcell",
- "Dual Fuel Rod (Tiberium)",
- 2,
- 50000,
- 2F,
- 1,
- 0.5F,
- BW_NonMeta_MaterialItems.Depleted_Tiberium_2.get(1),
- false));
- BW_NonMeta_MaterialItems.TiberiumCell_4.set(
- new GT_RadioactiveCellIC_Item(
- "Quad_Tiberiumcell",
- "Quad Fuel Rod (Tiberium)",
- 4,
- 50000,
- 2F,
- 1,
- 0.5F,
- BW_NonMeta_MaterialItems.Depleted_Tiberium_4.get(1),
- false));
- BW_NonMeta_MaterialItems.Depleted_TheCoreCell
- .set(new GT_DepletetCell_Item("Core_Reactor_CellDep", "Depleted \"The Core\" Cell", 32));
- BW_NonMeta_MaterialItems.TheCoreCell.set(
- new GT_RadioactiveCellIC_Item(
- "Core_Reactor_Cell",
- "\"The Core\" Cell",
- 32,
- 100000,
- 8F,
- 32,
- 1F,
- BW_NonMeta_MaterialItems.Depleted_TheCoreCell.get(1),
- false));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java
deleted file mode 100644
index d409084406..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-
-public interface IWerkstoffRunnable {
-
- void run(Werkstoff werkstoff);
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java
deleted file mode 100644
index a61bc55d59..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.Mods.Thaumcraft;
-
-import java.util.Objects;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.bartworks.util.log.DebugLog;
-import com.github.bartimaeusnek.crossmod.thaumcraft.util.ThaumcraftHandler;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TC_Aspects;
-
-public class AspectLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (!Thaumcraft.isModLoaded()) {
- return;
- }
-
- for (OrePrefixes enabledOrePrefixes : WerkstoffLoader.ENABLED_ORE_PREFIXES) {
- if (werkstoff.hasItemType(enabledOrePrefixes)) {
- if (enabledOrePrefixes.mMaterialAmount >= 3628800L || enabledOrePrefixes == OrePrefixes.ore) {
- DebugLog.log(
- "OrePrefix: " + enabledOrePrefixes.name()
- + " mMaterialAmount: "
- + enabledOrePrefixes.mMaterialAmount / 3628800L);
- if (Objects.nonNull(WerkstoffLoader.items.get(enabledOrePrefixes)))
- ThaumcraftHandler.AspectAdder.addAspectViaBW(
- werkstoff.get(enabledOrePrefixes),
- werkstoff.getTCAspects(
- enabledOrePrefixes == OrePrefixes.ore ? 1
- : (int) (enabledOrePrefixes.mMaterialAmount / 3628800L)));
- } else if (enabledOrePrefixes.mMaterialAmount >= 0L
- && Objects.nonNull(WerkstoffLoader.items.get(enabledOrePrefixes)))
- ThaumcraftHandler.AspectAdder
- .addAspectViaBW(werkstoff.get(enabledOrePrefixes), new Pair<>(TC_Aspects.PERDITIO.mAspect, 1));
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java
deleted file mode 100644
index 1262ab2499..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.cellMolten;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.plate;
-import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
-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.UniversalArcFurnace;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.TierEU;
-import gregtech.api.recipe.RecipeCategories;
-import gregtech.api.util.GT_RecipeConstants;
-
-public class BlockLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (!werkstoff.hasItemType(block)) return;
- if (werkstoff.hasItemType(ingot)) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(block))
- .itemOutputs(werkstoff.get(ingot, 9))
- .duration(16 * TICKS)
- .eut(90)
- .metadata(GT_RecipeConstants.RECYCLE, true)
- .addTo(UniversalArcFurnace);
- }
- if (werkstoff.hasItemType(cellMolten)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(block))
- .fluidOutputs(werkstoff.getMolten(1296))
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .duration(14 * SECONDS + 8 * TICKS)
- .eut(8)
- .addTo(fluidExtractionRecipes);
-
- }
- if (werkstoff.hasItemType(plate)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(block))
- .itemOutputs(werkstoff.get(plate, 9))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 10L,
- 1L))
- .eut(TierEU.RECIPE_LV)
- .addTo(cutterRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java
deleted file mode 100644
index 9ec4030943..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.blockCasing;
-import static gregtech.api.enums.OrePrefixes.blockCasingAdvanced;
-import static gregtech.api.enums.OrePrefixes.gearGt;
-import static gregtech.api.enums.OrePrefixes.gearGtSmall;
-import static gregtech.api.enums.OrePrefixes.plank;
-import static gregtech.api.enums.OrePrefixes.plate;
-import static gregtech.api.enums.OrePrefixes.plateDouble;
-import static gregtech.api.enums.OrePrefixes.screw;
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import com.github.bartimaeusnek.bartworks.system.material.BW_GT_MaterialReference;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-
-public class CasingLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff == BW_GT_MaterialReference.Wood /* || werkstoff == BW_GT_MaterialReference.WoodSealed */) {
- addCasingRecipes(werkstoff, plank);
- } else {
- if (!werkstoff.hasGenerationFeature(blockCasing) || !werkstoff.doesOreDictedItemExists(plate)
- || !werkstoff.doesOreDictedItemExists(screw)
- || !werkstoff.doesOreDictedItemExists(gearGtSmall)
- || !werkstoff.doesOreDictedItemExists(gearGt)
- || !werkstoff.doesOreDictedItemExists(plateDouble)) return;
-
- addCasingRecipes(werkstoff, plateDouble);
- }
- }
-
- private static void addCasingRecipes(Werkstoff werkstoff, OrePrefixes reboltedCasingsOuterStuff) {
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(blockCasing),
- new Object[] { "PSP", "PGP", "PSP", 'P', werkstoff.get(plate), 'S', werkstoff.get(screw), 'G',
- werkstoff.get(gearGtSmall) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate, 6), werkstoff.get(screw, 2), werkstoff.get(gearGtSmall))
- .itemOutputs(werkstoff.get(blockCasing))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(assemblerRecipes);
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(blockCasingAdvanced),
- new Object[] { "PSP", "PGP", "PSP", 'P', werkstoff.get(reboltedCasingsOuterStuff), 'S',
- werkstoff.get(screw), 'G', werkstoff.get(gearGt) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(reboltedCasingsOuterStuff, 6), werkstoff.get(screw, 2), werkstoff.get(gearGt))
- .itemOutputs(werkstoff.get(blockCasingAdvanced))
- .duration(10 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(assemblerRecipes);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java
deleted file mode 100644
index 2b86f46149..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.OrePrefixes.capsule;
-import static gregtech.api.enums.OrePrefixes.cell;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Objects;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidContainerRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-
-import gregtech.api.enums.Element;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.interfaces.ISubTagContainer;
-import gregtech.api.recipe.RecipeCategories;
-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.common.items.behaviors.Behaviour_DataOrb;
-
-public class CellLoader implements IWerkstoffRunnable {
-
- @Override
- @SuppressWarnings("unchecked")
- public void run(Werkstoff werkstoff) {
- if (!werkstoff.hasItemType(cell)) return;
-
- if ((werkstoff.getStats()
- .isElektrolysis()
- || werkstoff.getStats()
- .isCentrifuge())
- && !werkstoff.hasItemType(dust)) {
- List<FluidStack> flOutputs = new ArrayList<>();
- List<ItemStack> stOutputs = new ArrayList<>();
- HashMap<ISubTagContainer, Pair<Integer, Integer>> tracker = new HashMap<>();
- int cells = 0;
- for (Pair<ISubTagContainer, Integer> container : werkstoff.getContents()
- .getValue()
- .toArray(new Pair[0])) {
- if (container.getKey() instanceof Materials) {
- if ((((Materials) container.getKey()).hasCorrespondingGas()
- || ((Materials) container.getKey()).hasCorrespondingFluid()
- || ((Materials) container.getKey()).mIconSet == TextureSet.SET_FLUID)
- && ((Materials) container.getKey()).getDust(0) == null) {
- FluidStack tmpFl = ((Materials) container.getKey()).getGas(1000L * container.getValue());
- if (tmpFl == null || tmpFl.getFluid() == null) {
- tmpFl = ((Materials) container.getKey()).getFluid(1000L * container.getValue());
- }
- flOutputs.add(tmpFl);
- if (flOutputs.size() > 1) {
- if (!tracker.containsKey(container.getKey())) {
- stOutputs.add(((Materials) container.getKey()).getCells(container.getValue()));
- tracker.put(container.getKey(), new Pair<>(container.getValue(), stOutputs.size() - 1));
- } else {
- stOutputs.add(
- ((Materials) container.getKey()).getCells(
- tracker.get(container.getKey())
- .getKey() + container.getValue()));
- stOutputs.remove(
- tracker.get(container.getKey())
- .getValue() + 1);
- }
- cells += container.getValue();
- }
- } else {
- if (((Materials) container.getKey()).getDust(container.getValue()) == null) continue;
- if (!tracker.containsKey(container.getKey())) {
- stOutputs.add(((Materials) container.getKey()).getDust(container.getValue()));
- tracker.put(container.getKey(), new Pair<>(container.getValue(), stOutputs.size() - 1));
- } else {
- stOutputs.add(
- ((Materials) container.getKey()).getDust(
- tracker.get(container.getKey())
- .getKey() + container.getValue()));
- stOutputs.remove(
- tracker.get(container.getKey())
- .getValue() + 1);
- }
- }
- } else if (container.getKey() instanceof Werkstoff) {
- if (((Werkstoff) container.getKey()).getStats()
- .isGas() || ((Werkstoff) container.getKey()).hasItemType(cell)) {
- FluidStack tmpFl = ((Werkstoff) container.getKey()).getFluidOrGas(1000 * container.getValue());
- if (tmpFl == null || tmpFl.getFluid() == null) {
- tmpFl = ((Werkstoff) container.getKey()).getFluidOrGas(1000 * container.getValue());
- }
- flOutputs.add(tmpFl);
- if (flOutputs.size() > 1) {
- if (!tracker.containsKey(container.getKey())) {
- stOutputs.add(((Werkstoff) container.getKey()).get(cell, container.getValue()));
- tracker.put(container.getKey(), new Pair<>(container.getValue(), stOutputs.size() - 1));
- } else {
- stOutputs.add(
- ((Werkstoff) container.getKey()).get(
- cell,
- tracker.get(container.getKey())
- .getKey() + container.getValue()));
- stOutputs.remove(
- tracker.get(container.getKey())
- .getValue() + 1);
- }
- cells += container.getValue();
- }
- } else {
- if (!((Werkstoff) container.getKey()).hasItemType(dust)) continue;
- if (!tracker.containsKey(container.getKey())) {
- stOutputs.add(((Werkstoff) container.getKey()).get(dust, container.getValue()));
- tracker.put(container.getKey(), new Pair<>(container.getValue(), stOutputs.size() - 1));
- } else {
- stOutputs.add(
- ((Werkstoff) container.getKey()).get(
- dust,
- tracker.get(container.getKey())
- .getKey() + container.getValue()));
- stOutputs.remove(
- tracker.get(container.getKey())
- .getValue() + 1);
- }
- }
- }
- }
- ItemStack input = werkstoff.get(cell);
- input.stackSize = 1;
-
- int cellEmpty = cells - 1;
-
- stOutputs.add(Materials.Empty.getCells(-cellEmpty));
- if (werkstoff.getStats()
- .isElektrolysis())
- RecipeMaps.electrolyzerRecipes.add(
- new GT_Recipe(
- true,
- new ItemStack[] { input, cellEmpty > 0 ? Materials.Empty.getCells(cellEmpty) : null },
- stOutputs.toArray(new ItemStack[0]),
- null,
- null,
- new FluidStack[] { null },
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getProtons()
- * werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 30,
- 0));
- if (werkstoff.getStats()
- .isCentrifuge())
- RecipeMaps.centrifugeRecipes.add(
- new GT_Recipe(
- true,
- new ItemStack[] { input, cellEmpty > 0 ? Materials.Empty.getCells(cellEmpty) : null },
- stOutputs.toArray(new ItemStack[0]),
- null,
- null,
- new FluidStack[] { null },
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getMass()
- * werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 5,
- 0));
- }
-
- // Tank "Recipe"
- GT_Utility.addFluidContainerData(
- new FluidContainerRegistry.FluidContainerData(
- new FluidStack(Objects.requireNonNull(WerkstoffLoader.fluids.get(werkstoff)), 1000),
- werkstoff.get(cell),
- Materials.Empty.getCells(1)));
- FluidContainerRegistry.registerFluidContainer(
- werkstoff.getFluidOrGas(1)
- .getFluid(),
- werkstoff.get(cell),
- Materials.Empty.getCells(1));
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Empty.getCells(1))
- .itemOutputs(werkstoff.get(cell))
- .fluidInputs(new FluidStack(Objects.requireNonNull(WerkstoffLoader.fluids.get(werkstoff)), 1000))
- .duration(16 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(cell))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidOutputs(new FluidStack(Objects.requireNonNull(WerkstoffLoader.fluids.get(werkstoff)), 1000))
- .duration(16 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- if (Forestry.isModLoaded()) {
- FluidContainerRegistry.FluidContainerData emptyData = new FluidContainerRegistry.FluidContainerData(
- new FluidStack(Objects.requireNonNull(WerkstoffLoader.fluids.get(werkstoff)), 1000),
- werkstoff.get(capsule),
- GT_ModHandler.getModItem(Forestry.ID, "waxCapsule", 1),
- true);
- GT_Utility.addFluidContainerData(emptyData);
- FluidContainerRegistry.registerFluidContainer(emptyData);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(capsule))
- .fluidOutputs(new FluidStack(Objects.requireNonNull(WerkstoffLoader.fluids.get(werkstoff)), 1000))
- .duration(16 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
- }
-
- if (werkstoff.hasItemType(dust)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust))
- .fluidOutputs(werkstoff.getFluidOrGas(1000))
- .duration(
- werkstoff.getStats()
- .getMass())
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(werkstoff.get(dust))
- .fluidInputs(werkstoff.getFluidOrGas(1000))
- .duration(
- (int) werkstoff.getStats()
- .getMass())
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- }
-
- if (Werkstoff.Types.ELEMENT.equals(werkstoff.getType())) {
- Materials werkstoffBridgeMaterial = null;
- boolean ElementSet = false;
- for (Element e : Element.values()) {
- if (e.toString()
- .equals(werkstoff.getToolTip())) {
- werkstoffBridgeMaterial = werkstoff.getBridgeMaterial() != null ? werkstoff.getBridgeMaterial()
- : new Materials(
- -1,
- werkstoff.getTexSet(),
- 0,
- 0,
- 0,
- false,
- werkstoff.getDefaultName(),
- werkstoff.getDefaultName());
- werkstoffBridgeMaterial.mElement = e;
- e.mLinkedMaterials.add(werkstoffBridgeMaterial);
- ElementSet = true;
- werkstoff.setBridgeMaterial(werkstoffBridgeMaterial);
- break;
- }
- }
- if (!ElementSet) return;
-
- GT_OreDictUnificator.addAssociation(cell, werkstoffBridgeMaterial, werkstoff.get(cell), false);
-
- ItemStack scannerOutput = ItemList.Tool_DataOrb.get(1L);
- Behaviour_DataOrb.setDataTitle(scannerOutput, "Elemental-Scan");
- Behaviour_DataOrb.setDataName(scannerOutput, werkstoff.getToolTip());
- RecipeMaps.scannerFakeRecipes.addFakeRecipe(
- false,
- new GT_Recipe(
- false,
- new ItemStack[] { werkstoff.get(cell) },
- new ItemStack[] { scannerOutput },
- ItemList.Tool_DataOrb.get(1L),
- null,
- null,
- null,
- (int) (werkstoffBridgeMaterial.getMass() * 8192L),
- 30,
- 0));
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java
deleted file mode 100644
index 91fe34e89f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.bolt;
-import static gregtech.api.enums.OrePrefixes.cellMolten;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.dustTiny;
-import static gregtech.api.enums.OrePrefixes.gearGt;
-import static gregtech.api.enums.OrePrefixes.gearGtSmall;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.plate;
-import static gregtech.api.enums.OrePrefixes.ring;
-import static gregtech.api.enums.OrePrefixes.rotor;
-import static gregtech.api.enums.OrePrefixes.screw;
-import static gregtech.api.enums.OrePrefixes.stick;
-import static gregtech.api.enums.OrePrefixes.wireFine;
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
-import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
-import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-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 com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
-
-public class CraftingMaterialLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(screw)) {
- int tVoltageMultiplier = werkstoff.getStats()
- .getMeltingPoint() >= 2800 ? 60 : 15;
-
- // bolt
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- werkstoff.hasItemType(gem) ? werkstoff.get(gem) : werkstoff.get(ingot),
- ItemList.Shape_Extruder_Bolt.get(0L))
- .itemOutputs(werkstoff.get(bolt, 8))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2L,
- 1))
- .eut(8 * tVoltageMultiplier)
- .addTo(extruderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stick))
- .itemOutputs(werkstoff.get(bolt, 4))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2L,
- 1L))
- .eut(4)
- .addTo(cutterRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(bolt))
- .itemOutputs(werkstoff.get(dustTiny, 1))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- // screw
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(bolt))
- .itemOutputs(werkstoff.get(screw))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 8L,
- 1L))
- .eut(4)
- .addTo(latheRecipes);
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(screw),
- GT_Proxy.tBits,
- new Object[] { "fX", "X ", 'X', werkstoff.get(bolt) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(screw))
- .itemOutputs(werkstoff.get(dustTiny, 1))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- if (werkstoff.hasItemType(gem)) return;
-
- // ring
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), ItemList.Shape_Extruder_Ring.get(0L))
- .itemOutputs(werkstoff.get(ring, 4))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2L,
- 1))
- .eut(6 * tVoltageMultiplier)
- .addTo(extruderRecipes);
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(ring),
- GT_Proxy.tBits,
- new Object[] { "h ", "fX", 'X', werkstoff.get(stick) });
-
- // Gear
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(gearGt),
- GT_Proxy.tBits,
- new Object[] { "SPS", "PwP", "SPS", 'P', werkstoff.get(plate), 'S', werkstoff.get(stick) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 4), ItemList.Shape_Extruder_Gear.get(0L))
- .itemOutputs(werkstoff.get(gearGt))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 5L,
- 1))
- .eut(8 * tVoltageMultiplier)
- .addTo(extruderRecipes);
- // wireFine
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), ItemList.Shape_Extruder_Wire.get(0L))
- .itemOutputs(werkstoff.get(wireFine, 8))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 1.5F,
- 1F))
- .eut(8 * tVoltageMultiplier)
- .addTo(extruderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), GT_Utility.getIntegratedCircuit(3))
- .itemOutputs(werkstoff.get(wireFine, 8))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1))
- .eut(8 * tVoltageMultiplier)
- .addTo(wiremillRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stick), GT_Utility.getIntegratedCircuit(3))
- .itemOutputs(werkstoff.get(wireFine, 4))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 0.5F,
- 1F))
- .eut(8 * tVoltageMultiplier)
- .addTo(wiremillRecipes);
-
- // smallGear
- if (WerkstoffLoader.smallGearShape != null) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), WerkstoffLoader.smallGearShape.get(0L))
- .itemOutputs(werkstoff.get(gearGtSmall))
- .duration(
- (int) werkstoff.getStats()
- .getMass())
- .eut(8 * tVoltageMultiplier)
- .addTo(extruderRecipes);
-
- }
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(gearGtSmall),
- GT_Proxy.tBits,
- new Object[] { " S ", "hPx", " S ", 'S', werkstoff.get(stick), 'P', werkstoff.get(plate) });
-
- // Rotor
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(rotor),
- GT_Proxy.tBits,
- new Object[] { "PhP", "SRf", "PdP", 'P', werkstoff.get(plate), 'R', werkstoff.get(ring), 'S',
- werkstoff.get(screw) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate, 4), werkstoff.get(ring))
- .itemOutputs(werkstoff.get(rotor))
- .fluidInputs(Materials.Tin.getMolten(32))
- .duration(12 * SECONDS)
- .eut(24)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate, 4), werkstoff.get(ring))
- .itemOutputs(werkstoff.get(rotor))
- .fluidInputs(Materials.Lead.getMolten(48))
- .duration(12 * SECONDS)
- .eut(24)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate, 4), werkstoff.get(ring))
- .itemOutputs(werkstoff.get(rotor))
- .fluidInputs(Materials.SolderingAlloy.getMolten(16))
- .duration(12 * SECONDS)
- .eut(24)
- .addTo(assemblerRecipes);
-
- if (WerkstoffLoader.rotorShape != null) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 5), WerkstoffLoader.rotorShape.get(0L))
- .itemOutputs(werkstoff.get(rotor))
- .duration(10 * SECONDS)
- .eut(60)
- .addTo(extruderRecipes);
-
- }
-
- // molten -> metal
- if (werkstoff.hasItemType(cellMolten)) {
-
- /*
- * !! No more hardcoded gear, etc. recipe gen, now must go through GenerationFeatures() !!
- * GT_Values.RA.addFluidSolidifierRecipe( ItemList.Shape_Mold_Gear.get(0L), werkstoff.getMolten(576),
- * werkstoff.get(gearGt), 128, 8); GT_Values.RA.addFluidSolidifierRecipe(
- * ItemList.Shape_Mold_Gear_Small.get(0L), werkstoff.getMolten(144), werkstoff.get(gearGtSmall), 16, 8);
- * if (WerkstoffLoader.ringMold != null) GT_Values.RA.addFluidSolidifierRecipe(
- * WerkstoffLoader.ringMold.get(0L), werkstoff.getMolten(36), werkstoff.get(ring), 100, 4 *
- * tVoltageMultiplier); if (WerkstoffLoader.boltMold != null) GT_Values.RA.addFluidSolidifierRecipe(
- * WerkstoffLoader.boltMold.get(0L), werkstoff.getMolten(18), werkstoff.get(bolt), 50, 2 *
- * tVoltageMultiplier); if (WerkstoffLoader.rotorMold != null) GT_Values.RA.addFluidSolidifierRecipe(
- * WerkstoffLoader.rotorMold.get(0L), werkstoff.getMolten(612), werkstoff.get(rotor), 100, 60);
- */
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gearGt))
- .itemOutputs(werkstoff.get(dust, 4))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gearGtSmall))
- .itemOutputs(werkstoff.get(dust, 1))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(rotor))
- .itemOutputs(werkstoff.get(dust, 4), werkstoff.get(dustSmall))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ring))
- .itemOutputs(werkstoff.get(dustSmall, 1))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java
deleted file mode 100644
index b33d0ddd20..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.crushed;
-import static gregtech.api.enums.OrePrefixes.crushedCentrifuged;
-import static gregtech.api.enums.OrePrefixes.crushedPurified;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustImpure;
-import static gregtech.api.enums.OrePrefixes.dustPure;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-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.ore;
-import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
-import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes;
-import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
-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 com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class CrushedLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (!werkstoff.hasItemType(ore) || !werkstoff.hasItemType(dust)) return;
-
- if (werkstoff.hasItemType(ingot) && !werkstoff.getStats()
- .isBlastFurnace()) {
- if (Werkstoff.Types.ELEMENT.equals(werkstoff.getType())) {
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(crushed), werkstoff.get(nugget, 10));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(crushedPurified), werkstoff.get(nugget, 10));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(crushedCentrifuged), werkstoff.get(nugget, 10));
- } else {
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(crushed), werkstoff.get(ingot));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(crushedPurified), werkstoff.get(ingot));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(crushedCentrifuged), werkstoff.get(ingot));
- }
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(dustImpure), werkstoff.get(ingot));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(dustPure), werkstoff.get(ingot));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(dust), werkstoff.get(ingot));
- }
-
- GT_ModHandler
- .addCraftingRecipe(werkstoff.get(dustImpure), new Object[] { "h ", "W ", 'W', werkstoff.get(crushed) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(dustPure),
- new Object[] { "h ", "W ", 'W', werkstoff.get(crushedPurified) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(dust),
- new Object[] { "h ", "W ", 'W', werkstoff.get(crushedCentrifuged) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(crushed))
- .itemOutputs(werkstoff.get(dustImpure))
- .duration(10 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_ModHandler.addPulverisationRecipe(
- werkstoff.get(crushed),
- werkstoff.get(dustImpure),
- werkstoff.getOreByProduct(0, dust),
- 10,
- false);
- GT_ModHandler.addOreWasherRecipe(
- werkstoff.get(crushed),
- new int[] { 10000, 1111, 10000 },
- 1000,
- werkstoff.get(crushedPurified),
- werkstoff.getOreByProduct(0, dust),
- GT_OreDictUnificator.get(dust, Materials.Stone, 1L));
- GT_ModHandler.addThermalCentrifugeRecipe(
- werkstoff.get(crushed),
- new int[] { 10000, 1111, 10000 },
- (int) Math.min(
- 5000L,
- Math.abs(
- werkstoff.getStats()
- .getProtons() * 20L)),
- werkstoff.get(crushedCentrifuged),
- werkstoff.getOreByProduct(1, dust),
- GT_OreDictUnificator.get(dust, Materials.Stone, 1L));
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(crushedPurified))
- .itemOutputs(werkstoff.get(dustPure))
- .duration(10 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_ModHandler.addPulverisationRecipe(
- werkstoff.get(crushedPurified),
- werkstoff.get(dustPure),
- werkstoff.getOreByProduct(1, dust),
- 10,
- false);
- GT_ModHandler.addThermalCentrifugeRecipe(
- werkstoff.get(crushedPurified),
- new int[] { 10000, 1111 },
- (int) Math.min(
- 5000L,
- Math.abs(
- werkstoff.getStats()
- .getProtons() * 20L)),
- werkstoff.get(crushedCentrifuged),
- werkstoff.getOreByProduct(1, dust));
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(crushedCentrifuged))
- .itemOutputs(werkstoff.get(dust))
- .duration(10 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_ModHandler.addPulverisationRecipe(
- werkstoff.get(crushedCentrifuged),
- werkstoff.get(dust),
- werkstoff.getOreByProduct(2, dust),
- 10,
- false);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustImpure))
- .itemOutputs(werkstoff.get(dust), werkstoff.getOreByProduct(0, dust))
- .outputChances(100_00, 11_11)
- .duration(
- Math.max(
- 1L,
- werkstoff.getStats()
- .getMass() * 8L))
- .eut(5)
- .addTo(centrifugeRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustPure))
- .itemOutputs(werkstoff.get(dust), werkstoff.getOreByProduct(1, dust))
- .outputChances(100_00, 11_11)
- .duration(
- Math.max(
- 1L,
- werkstoff.getStats()
- .getMass() * 8L))
- .eut(5)
- .addTo(centrifugeRecipes);
-
- if (werkstoff.contains(SubTag.CRYSTALLISABLE)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustPure))
- .itemOutputs(werkstoff.get(gem))
- .outputChances(9000)
- .fluidInputs(Materials.Water.getFluid(200L))
- .duration(1 * MINUTES + 40 * SECONDS)
- .eut(24)
- .addTo(autoclaveRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustImpure))
- .itemOutputs(werkstoff.get(gem))
- .outputChances(9000)
- .fluidInputs(Materials.Water.getFluid(200L))
- .duration(1 * MINUTES + 40 * SECONDS)
- .eut(24)
- .addTo(autoclaveRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustPure))
- .itemOutputs(werkstoff.get(gem))
- .outputChances(9500)
- .fluidInputs(gregtech.api.util.GT_ModHandler.getDistilledWater(200L))
- .duration(1 * MINUTES + 15 * SECONDS)
- .eut(24)
- .addTo(autoclaveRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustImpure))
- .itemOutputs(werkstoff.get(gem))
- .outputChances(9500)
- .fluidInputs(gregtech.api.util.GT_ModHandler.getDistilledWater(200L))
- .duration(1 * MINUTES + 15 * SECONDS)
- .eut(24)
- .addTo(autoclaveRecipes);
-
- }
- if (werkstoff.contains(SubTag.WASHING_MERCURY)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(crushed))
- .itemOutputs(
- werkstoff.get(crushedPurified),
- werkstoff.getOreByProduct(1, dust),
- GT_OreDictUnificator.get(dust, Materials.Stone, 1L))
- .outputChances(10000, 7000, 4000)
- .fluidInputs(Materials.Mercury.getFluid(1000L))
- .duration(40 * SECONDS)
- .eut(8)
- .addTo(chemicalBathRecipes);
-
- }
- if (werkstoff.contains(SubTag.WASHING_SODIUMPERSULFATE)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(crushed))
- .itemOutputs(
- werkstoff.get(crushedPurified),
- werkstoff.getOreByProduct(1, dust),
- GT_OreDictUnificator.get(dust, Materials.Stone, 1L))
- .outputChances(10000, 7000, 4000)
- .fluidInputs(
- Materials.SodiumPersulfate.getFluid(GT_Mod.gregtechproxy.mDisableOldChemicalRecipes ? 1000L : 100L))
- .duration(40 * SECONDS)
- .eut(8)
- .addTo(chemicalBathRecipes);
-
- }
- if (werkstoff.contains(SubTag.ELECTROMAGNETIC_SEPERATION_GOLD)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustPure))
- .itemOutputs(
- werkstoff.get(dust),
- GT_OreDictUnificator.get(dustSmall, Materials.Gold, 1L),
- GT_OreDictUnificator.get(nugget, Materials.Gold, 1L))
- .outputChances(10000, 4000, 2000)
- .duration(20 * SECONDS)
- .eut(24)
- .addTo(electroMagneticSeparatorRecipes);
-
- } else if (werkstoff.contains(SubTag.ELECTROMAGNETIC_SEPERATION_IRON)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustPure))
- .itemOutputs(
- werkstoff.get(dust),
- GT_OreDictUnificator.get(dustSmall, Materials.Iron, 1L),
- GT_OreDictUnificator.get(nugget, Materials.Iron, 1L))
- .outputChances(10000, 4000, 2000)
- .duration(20 * SECONDS)
- .eut(24)
- .addTo(electroMagneticSeparatorRecipes);
-
- } else if (werkstoff.contains(SubTag.ELECTROMAGNETIC_SEPERATION_NEODYMIUM)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustPure))
- .itemOutputs(
- werkstoff.get(dust),
- GT_OreDictUnificator.get(dustSmall, Materials.Neodymium, 1L),
- GT_OreDictUnificator.get(nugget, Materials.Neodymium, 1L))
- .outputChances(10000, 4000, 2000)
- .duration(20 * SECONDS)
- .eut(24)
- .addTo(electroMagneticSeparatorRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java
deleted file mode 100644
index 088c4bb55b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.cell;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.dustTiny;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.ingotHot;
-import static gregtech.api.enums.OrePrefixes.nugget;
-import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
-import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
-import static gregtech.api.recipe.RecipeMaps.primitiveBlastRecipes;
-import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.enums.TierEU;
-import gregtech.api.interfaces.ISubTagContainer;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_Utility;
-
-public class DustLoader implements IWerkstoffRunnable {
-
- @Override
- @SuppressWarnings("unchecked")
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(dust)) {
- List<FluidStack> flOutputs = new ArrayList<>();
- List<ItemStack> stOutputs = new ArrayList<>();
- HashMap<ISubTagContainer, Pair<Integer, Integer>> tracker = new HashMap<>();
- int cells = 0;
-
- if (werkstoff.getGenerationFeatures()
- .hasMixerRecipes()
- || werkstoff.getStats()
- .isElektrolysis()
- || werkstoff.getStats()
- .isCentrifuge()
- || werkstoff.getGenerationFeatures()
- .hasChemicalRecipes()) {
- for (Pair<ISubTagContainer, Integer> container : werkstoff.getContents()
- .getValue()
- .toArray(new Pair[0])) {
- final ISubTagContainer key = container.getKey();
- final int value = container.getValue();
- if (key instanceof Materials materialKey) {
- if ((materialKey.getGas(0) != null || materialKey.getFluid(0) != null
- || materialKey.mIconSet == TextureSet.SET_FLUID) && materialKey.getDust(0) == null) {
- FluidStack tmpFl = materialKey.getGas(1000L * value);
- if (tmpFl == null || tmpFl.getFluid() == null) {
- tmpFl = materialKey.getFluid(1000L * value);
- }
- flOutputs.add(tmpFl);
- if (flOutputs.size() > 1) {
- if (!tracker.containsKey(key)) {
- stOutputs.add(materialKey.getCells(value));
- tracker.put(key, new Pair<>(value, stOutputs.size() - 1));
- } else {
- stOutputs.add(
- materialKey.getCells(
- tracker.get(key)
- .getKey() + value));
- stOutputs.remove(
- tracker.get(key)
- .getValue() + 1);
- }
- cells += value;
- }
- } else {
- if (materialKey.getDust(value) == null) {
- if (materialKey.getCells(value) == null
- || materialKey.getMolten(0) == null && materialKey.getSolid(0) == null) continue;
- FluidStack tmpFl = materialKey.getMolten(1000L * value);
- if (tmpFl == null || tmpFl.getFluid() == null) {
- tmpFl = materialKey.getSolid(1000L * value);
- }
- flOutputs.add(tmpFl);
- if (flOutputs.size() > 1) {
- if (!tracker.containsKey(key)) {
- stOutputs.add(materialKey.getCells(value));
- tracker.put(key, new Pair<>(value, stOutputs.size() - 1));
- } else {
- stOutputs.add(
- materialKey.getCells(
- tracker.get(key)
- .getKey() + value));
- stOutputs.remove(
- tracker.get(key)
- .getValue() + 1);
- }
- cells += value;
- }
- }
- if (!tracker.containsKey(key)) {
- stOutputs.add(materialKey.getDust(value));
- tracker.put(key, new Pair<>(value, stOutputs.size() - 1));
- } else {
- stOutputs.add(
- materialKey.getDust(
- tracker.get(key)
- .getKey() + value));
- stOutputs.remove(
- tracker.get(key)
- .getValue() + 1);
- }
- }
- } else if (key instanceof Werkstoff werkstoffKey) {
- if (werkstoffKey.getStats()
- .isGas() || werkstoffKey.hasItemType(cell)) {
- FluidStack tmpFl = werkstoffKey.getFluidOrGas(1000 * value);
- if (tmpFl == null || tmpFl.getFluid() == null) {
- tmpFl = werkstoffKey.getFluidOrGas(1000 * value);
- }
- flOutputs.add(tmpFl);
- if (flOutputs.size() > 1) {
- if (!tracker.containsKey(key)) {
- stOutputs.add(werkstoffKey.get(cell, value));
- tracker.put(key, new Pair<>(value, stOutputs.size() - 1));
- } else {
- stOutputs.add(
- werkstoffKey.get(
- cell,
- tracker.get(key)
- .getKey() + value));
- stOutputs.remove(
- tracker.get(key)
- .getValue() + 1);
- }
- cells += value;
- }
- } else {
- if (!werkstoffKey.hasItemType(dust)) continue;
- if (!tracker.containsKey(key)) {
- stOutputs.add(werkstoffKey.get(dust, value));
- tracker.put(key, new Pair<>(value, stOutputs.size() - 1));
- } else {
- stOutputs.add(
- werkstoffKey.get(
- dust,
- tracker.get(key)
- .getKey() + value));
- stOutputs.remove(
- tracker.get(key)
- .getValue() + 1);
- }
- }
- }
- }
- ItemStack input = werkstoff.get(dust);
- input.stackSize = werkstoff.getContents()
- .getKey();
- if (werkstoff.getStats()
- .isElektrolysis()) {
- GT_Recipe tRecipe = new GT_Recipe(
- true,
- new ItemStack[] { input, cells > 0 ? Materials.Empty.getCells(cells) : null },
- stOutputs.toArray(new ItemStack[0]),
- null,
- null,
- new FluidStack[] { null },
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getProtons()
- / werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 30,
- 0);
- RecipeMaps.electrolyzerRecipes.add(tRecipe);
- RecipeMaps.electrolyzerNonCellRecipes.add(tRecipe);
- }
- if (werkstoff.getStats()
- .isCentrifuge()) {
- RecipeMaps.centrifugeRecipes.add(
- new GT_Recipe(
- true,
- new ItemStack[] { input, cells > 0 ? Materials.Empty.getCells(cells) : null },
- stOutputs.toArray(new ItemStack[0]),
- null,
- null,
- new FluidStack[] { null },
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getMass()
- / werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 5,
- 0));
- GT_Recipe tRecipe = new GT_Recipe(
- false,
- stOutputs.toArray(new ItemStack[0]),
- new ItemStack[] { input },
- null,
- null,
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- null,
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getProtons()
- / werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 30,
- 0);
- RecipeMaps.centrifugeNonCellRecipes.add(tRecipe);
- }
- if (werkstoff.getGenerationFeatures()
- .hasChemicalRecipes()) {
- if (cells > 0) stOutputs.add(Materials.Empty.getCells(cells));
- GT_Values.RA.stdBuilder()
- .itemInputs(stOutputs.toArray(new ItemStack[0]))
- .itemOutputs(input)
- .fluidInputs(flOutputs.toArray(new FluidStack[0]))
- .duration(
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getProtons()
- / werkstoff.getContents()
- .getValue()
- .size())))
- .eut(
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 30)
- .addTo(GT_RecipeConstants.UniversalChemical);
- }
- if (werkstoff.getGenerationFeatures()
- .hasMixerRecipes()) {
- if (cells > 0) stOutputs.add(Materials.Empty.getCells(cells));
- short circuitID = werkstoff.getMixCircuit();
- ItemStack circuit = circuitID == -1 ? null : GT_Utility.getIntegratedCircuit(circuitID);
- if (circuit != null) stOutputs.add(circuit);
- RecipeMaps.mixerRecipes.add(
- new GT_Recipe(
- true,
- stOutputs.toArray(new ItemStack[0]),
- new ItemStack[] { input },
- null,
- null,
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- null,
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getMass()
- / werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 5,
- 0));
- GT_Recipe tRecipe = new GT_Recipe(
- false,
- stOutputs.toArray(new ItemStack[0]),
- new ItemStack[] { input },
- null,
- null,
- new FluidStack[] { flOutputs.size() > 0 ? flOutputs.get(0) : null },
- null,
- (int) Math.max(
- 1L,
- Math.abs(
- werkstoff.getStats()
- .getProtons()
- / werkstoff.getContents()
- .getValue()
- .size())),
- Math.min(
- 4,
- werkstoff.getContents()
- .getValue()
- .size())
- * 30,
- 0);
- RecipeMaps.mixerNonCellRecipes.add(tRecipe);
- }
- }
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(dust),
- new Object[] { "TTT", "TTT", "TTT", 'T', werkstoff.get(dustTiny) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(dust),
- new Object[] { "TT ", "TT ", 'T', WerkstoffLoader.getCorrespondingItemStack(dustSmall, werkstoff) });
- GT_ModHandler.addCraftingRecipe(
- WerkstoffLoader.getCorrespondingItemStack(dustSmall, werkstoff, 4),
- new Object[] { " T ", 'T', werkstoff.get(dust) });
- GT_ModHandler.addCraftingRecipe(
- WerkstoffLoader.getCorrespondingItemStack(dustTiny, werkstoff, 9),
- new Object[] { "T ", 'T', werkstoff.get(dust) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustTiny, 9), ItemList.Schematic_Dust.get(0L))
- .itemOutputs(werkstoff.get(dust))
- .duration(5 * SECONDS)
- .eut(4)
- .addTo(packagerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustSmall, 4), ItemList.Schematic_Dust.get(0L))
- .itemOutputs(werkstoff.get(dust))
- .duration(5 * SECONDS)
- .eut(4)
- .addTo(packagerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustTiny, 9), ItemList.Schematic_3by3.get(0L))
- .itemOutputs(werkstoff.get(dust))
- .duration(5 * SECONDS)
- .eut(4)
- .addTo(packagerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustSmall, 4), ItemList.Schematic_2by2.get(0L))
- .itemOutputs(werkstoff.get(dust))
- .duration(5 * SECONDS)
- .eut(4)
- .addTo(packagerRecipes);
-
- if (werkstoff.hasItemType(ingot) && !werkstoff.getStats()
- .isBlastFurnace()) {
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(dust), werkstoff.get(ingot));
- GT_ModHandler.addSmeltingRecipe(werkstoff.get(dustTiny), werkstoff.get(nugget));
- } else if (werkstoff.hasItemType(ingot) && werkstoff.getStats()
- .isBlastFurnace()
- && werkstoff.getStats()
- .getMeltingPoint() != 0) {
- if (werkstoff.contains(WerkstoffLoader.ANAEROBE_SMELTING)) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust), GT_Utility.getIntegratedCircuit(11))
- .itemOutputs(
- werkstoff.getStats()
- .getMeltingPoint() < 1750 ? werkstoff.get(ingot) : werkstoff.get(ingotHot))
- .fluidInputs(Materials.Nitrogen.getGas(1000))
- .duration(
- Math.max(
- werkstoff.getStats()
- .getMass() / 40L,
- 1L)
- * werkstoff.getStats()
- .getMeltingPoint())
- .eut(
- werkstoff.getStats()
- .getMeltingVoltage())
- .metadata(
- COIL_HEAT,
- werkstoff.getStats()
- .getMeltingPoint())
- .addTo(blastFurnaceRecipes);
-
- } else if (werkstoff.contains(WerkstoffLoader.NOBLE_GAS_SMELTING)) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust), GT_Utility.getIntegratedCircuit(11))
- .itemOutputs(
- werkstoff.getStats()
- .getMeltingPoint() < 1750 ? werkstoff.get(ingot) : werkstoff.get(ingotHot))
- .fluidInputs(Materials.Argon.getGas(1000))
- .duration(
- Math.max(
- werkstoff.getStats()
- .getMass() / 40L,
- 1L)
- * werkstoff.getStats()
- .getMeltingPoint())
- .eut(
- werkstoff.getStats()
- .getMeltingVoltage())
- .metadata(
- COIL_HEAT,
- werkstoff.getStats()
- .getMeltingPoint())
- .addTo(blastFurnaceRecipes);
-
- } else {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(
- werkstoff.getStats()
- .getMeltingPoint() < 1750 ? werkstoff.get(ingot) : werkstoff.get(ingotHot))
- .duration(
- Math.max(
- werkstoff.getStats()
- .getMass() / 40L,
- 1L)
- * werkstoff.getStats()
- .getMeltingPoint())
- .eut(
- werkstoff.getStats()
- .getMeltingVoltage())
- .metadata(
- COIL_HEAT,
- werkstoff.getStats()
- .getMeltingPoint())
- .addTo(blastFurnaceRecipes);
-
- if (werkstoff.getStats()
- .getMeltingPoint() <= 1000) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust))
- .itemOutputs(werkstoff.get(ingot))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 40L,
- 1L) * werkstoff.getStats()
- .getMeltingPoint())
- .eut(0)
- .metadata(ADDITIVE_AMOUNT, 9)
- .addTo(primitiveBlastRecipes);
- }
- }
- }
-
- if (werkstoff.getStats()
- .isBlastFurnace()
- && werkstoff.getStats()
- .getMeltingPoint() > 1750) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingotHot))
- .itemOutputs(werkstoff.get(ingot))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 3L,
- 1L))
- .eut(TierEU.RECIPE_MV)
- .addTo(vacuumFreezerRecipes);
- }
-
- if (werkstoff.hasItemType(ingot)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot))
- .itemOutputs(werkstoff.get(dust))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(nugget))
- .itemOutputs(werkstoff.get(dustTiny))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- }
- if (werkstoff.hasItemType(ingot) || werkstoff.hasItemType(gem)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(block))
- .itemOutputs(werkstoff.get(dust, 9))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java
deleted file mode 100644
index 187456a3b4..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.crushedPurified;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.dustTiny;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.gemChipped;
-import static gregtech.api.enums.OrePrefixes.gemExquisite;
-import static gregtech.api.enums.OrePrefixes.gemFlawed;
-import static gregtech.api.enums.OrePrefixes.gemFlawless;
-import static gregtech.api.enums.OrePrefixes.lens;
-import static gregtech.api.enums.OrePrefixes.ore;
-import static gregtech.api.enums.OrePrefixes.plate;
-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.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
-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 net.minecraft.item.ItemStack;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-import com.github.bartimaeusnek.bartworks.util.BW_ColorUtil;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-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_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class GemLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(gem)) {
- if (werkstoff.getGenerationFeatures()
- .hasSifterRecipes() || werkstoff.hasItemType(ore) && werkstoff.hasItemType(dust)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gem, 9))
- .itemOutputs(werkstoff.get(block))
- .duration(15 * SECONDS)
- .eut(2)
- .addTo(compressorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(block))
- .itemOutputs(werkstoff.get(gem, 9))
- .duration(5 * SECONDS)
- .eut(24)
- .addTo(hammerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(crushedPurified))
- .itemOutputs(
- werkstoff.get(gemExquisite),
- werkstoff.get(gemFlawless),
- werkstoff.get(gem),
- werkstoff.get(gemFlawed),
- werkstoff.get(gemChipped),
- werkstoff.get(dust))
- .outputChances(200, 1000, 2500, 2000, 4000, 5000)
- .duration(40 * SECONDS)
- .eut(16)
- .addTo(sifterRecipes);
-
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemExquisite))
- .itemOutputs(werkstoff.get(dust, 4))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawless))
- .itemOutputs(werkstoff.get(dust, 2))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gem))
- .itemOutputs(werkstoff.get(dust))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawed))
- .itemOutputs(werkstoff.get(dustSmall, 2))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemChipped))
- .itemOutputs(werkstoff.get(dustSmall))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(gemFlawless, 2),
- 0,
- new Object[] { "h ", "W ", 'W', werkstoff.get(gemExquisite) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(gem, 2),
- 0,
- new Object[] { "h ", "W ", 'W', werkstoff.get(gemFlawless) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(gemFlawed, 2),
- 0,
- new Object[] { "h ", "W ", 'W', werkstoff.get(gem) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(gemChipped, 2),
- 0,
- new Object[] { "h ", "W ", 'W', werkstoff.get(gemFlawed) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemExquisite))
- .itemOutputs(werkstoff.get(gemFlawless, 2))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawless))
- .itemOutputs(werkstoff.get(gem, 2))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gem))
- .itemOutputs(werkstoff.get(gemFlawed, 2))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawed))
- .itemOutputs(werkstoff.get(gemChipped, 2))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemChipped))
- .itemOutputs(werkstoff.get(dustTiny))
- .duration(3 * SECONDS + 4 * TICKS)
- .eut(16)
- .addTo(hammerRecipes);
-
- if (!werkstoff.contains(WerkstoffLoader.NO_BLAST)) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawless, 3))
- .itemOutputs(werkstoff.get(gemExquisite), GT_OreDictUnificator.get(dustTiny, Materials.DarkAsh, 2))
- .duration(20 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .metadata(ADDITIVE_AMOUNT, 8)
- .addTo(implosionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gem, 3))
- .itemOutputs(werkstoff.get(gemFlawless), GT_OreDictUnificator.get(dustTiny, Materials.DarkAsh, 2))
- .duration(20 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .metadata(ADDITIVE_AMOUNT, 8)
- .addTo(implosionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawed, 3))
- .itemOutputs(werkstoff.get(gem), GT_OreDictUnificator.get(dustTiny, Materials.DarkAsh, 2))
- .duration(20 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .metadata(ADDITIVE_AMOUNT, 8)
- .addTo(implosionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemChipped, 3))
- .itemOutputs(werkstoff.get(gemFlawed), GT_OreDictUnificator.get(dustTiny, Materials.DarkAsh, 2))
- .duration(20 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .metadata(ADDITIVE_AMOUNT, 8)
- .addTo(implosionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust, 4))
- .itemOutputs(werkstoff.get(gem, 3), GT_OreDictUnificator.get(dustTiny, Materials.DarkAsh, 8))
- .duration(20 * TICKS)
- .eut(TierEU.RECIPE_LV)
- .metadata(ADDITIVE_AMOUNT, 24)
- .addTo(implosionRecipes);
- }
-
- if (werkstoff.hasItemType(plate)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate))
- .itemOutputs(werkstoff.get(lens), werkstoff.get(dustSmall))
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(latheRecipes);
-
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemExquisite))
- .itemOutputs(werkstoff.get(lens), werkstoff.get(dust, 2))
- .duration(2 * MINUTES)
- .eut(TierEU.RECIPE_LV)
- .addTo(latheRecipes);
-
- final ITexture texture = TextureFactory.of(
- Textures.BlockIcons.MACHINE_CASINGS[2][0],
- TextureFactory.of(Textures.BlockIcons.OVERLAY_LENS, werkstoff.getRGBA(), false));
- GregTech_API.registerCover(
- werkstoff.get(lens),
- texture,
- new gregtech.common.covers.GT_Cover_Lens(
- BW_ColorUtil.getDyeFromColor(werkstoff.getRGBA()).mIndex,
- texture));
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(lens))
- .itemOutputs(werkstoff.get(dustSmall, 3))
- .duration(20 * SECONDS)
- .eut(2)
- .addTo(maceratorRecipes);
-
- for (ItemStack is : OreDictionary
- .getOres("craftingLens" + BW_ColorUtil.getDyeFromColor(werkstoff.getRGBA()).mName.replace(" ", ""))) {
- is.stackSize = 0;
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemChipped, 3), is)
- .itemOutputs(werkstoff.get(gemFlawed, 1))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(laserEngraverRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawed, 3), is)
- .itemOutputs(werkstoff.get(gem, 1))
- .duration(30 * SECONDS)
- .eut(TierEU.RECIPE_MV)
- .addTo(laserEngraverRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gem, 3), is)
- .itemOutputs(werkstoff.get(gemFlawless, 1))
- .duration(60 * SECONDS)
- .eut(TierEU.RECIPE_HV)
- .addTo(laserEngraverRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gemFlawless, 3), is)
- .itemOutputs(werkstoff.get(gemExquisite, 1))
- .duration(2 * MINUTES)
- .eut(2000)
- .addTo(laserEngraverRecipes);
-
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java
deleted file mode 100644
index d969ff056f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
-import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.recipe.RecipeCategories;
-import gregtech.api.recipe.RecipeMaps;
-
-public class MetalLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(ingot)) {
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 9))
- .itemOutputs(werkstoff.get(block))
- .duration(15 * SECONDS)
- .eut(2)
- .addTo(compressorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 9), ItemList.Shape_Extruder_Block.get(0))
- .itemOutputs(werkstoff.get(block))
- .duration(
- (int) werkstoff.getStats()
- .getMass())
- .eut(
- 8 * werkstoff.getStats()
- .getMeltingPoint() >= 2800 ? 60 : 15)
- .addTo(extruderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 9), ItemList.Shape_Mold_Block.get(0L))
- .itemOutputs(werkstoff.get(block))
- .duration(
- (int) (werkstoff.getStats()
- .getMass() / 2))
- .eut(
- 4 * werkstoff.getStats()
- .getMeltingPoint() >= 2800 ? 60 : 15)
- .recipeCategory(RecipeCategories.alloySmelterMolding)
- .addTo(RecipeMaps.alloySmelterRecipes);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java
deleted file mode 100644
index 86cc6aa732..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.bolt;
-import static gregtech.api.enums.OrePrefixes.capsuleMolten;
-import static gregtech.api.enums.OrePrefixes.cellMolten;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.dustTiny;
-import static gregtech.api.enums.OrePrefixes.gearGt;
-import static gregtech.api.enums.OrePrefixes.gearGtSmall;
-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.plateDouble;
-import static gregtech.api.enums.OrePrefixes.ring;
-import static gregtech.api.enums.OrePrefixes.rotor;
-import static gregtech.api.enums.OrePrefixes.screw;
-import static gregtech.api.enums.OrePrefixes.stick;
-import static gregtech.api.enums.OrePrefixes.stickLong;
-import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import java.util.Objects;
-
-import net.minecraftforge.fluids.FluidContainerRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.recipe.RecipeCategories;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Utility;
-
-public class MoltenCellLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (!werkstoff.hasItemType(cellMolten)) {
- return;
- }
-
- if (!werkstoff.hasItemType(ingot)) {
- if (!werkstoff.hasItemType(dust)) {
- return;
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dust))
- .fluidOutputs(werkstoff.getMolten(144))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustSmall))
- .fluidOutputs(werkstoff.getMolten(36))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(dustTiny))
- .fluidOutputs(werkstoff.getMolten(16))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- } else {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot))
- .fluidOutputs(werkstoff.getMolten(144))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(nugget))
- .fluidOutputs(werkstoff.getMolten(16))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Ingot.get(0))
- .itemOutputs(werkstoff.get(ingot))
- .fluidInputs(werkstoff.getMolten(144))
- .duration(
- (int) werkstoff.getStats()
- .getMass())
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Nugget.get(0))
- .itemOutputs(werkstoff.get(nugget))
- .fluidInputs(werkstoff.getMolten(16))
- .duration(
- (int) ((double) werkstoff.getStats()
- .getMass() / 9D))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Block.get(0))
- .itemOutputs(werkstoff.get(block))
- .fluidInputs(werkstoff.getMolten(1296))
- .duration(
- (int) werkstoff.getStats()
- .getMass() * 9)
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- if (!werkstoff.hasItemType(plate)) {
- return;
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stickLong))
- .fluidOutputs(werkstoff.getMolten(144))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate))
- .fluidOutputs(werkstoff.getMolten(144))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stick))
- .fluidOutputs(werkstoff.getMolten(72))
- .duration(15 * SECONDS)
- .eut(2)
- .recipeCategory(RecipeCategories.fluidExtractorRecycling)
- .addTo(fluidExtractionRecipes);
- }
-
- if (werkstoff.getGenerationFeatures()
- .hasMetalCraftingSolidifierRecipes()) {
-
- if (!werkstoff.hasItemType(plate)) {
- return;
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Rod_Long.get(0))
- .itemOutputs(werkstoff.get(stickLong))
- .fluidInputs(werkstoff.getMolten(144))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Rod.get(0))
- .itemOutputs(werkstoff.get(stick))
- .fluidInputs(werkstoff.getMolten(72))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 2,
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Plate.get(0))
- .itemOutputs(werkstoff.get(plate))
- .fluidInputs(werkstoff.getMolten(144))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- }
-
- if (werkstoff.getGenerationFeatures()
- .hasMetaSolidifierRecipes()) {
- if (!werkstoff.hasItemType(screw)) {
- return;
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Screw.get(0))
- .itemOutputs(werkstoff.get(screw))
- .fluidInputs(werkstoff.getMolten(18))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 8,
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Gear.get(0))
- .itemOutputs(werkstoff.get(gearGt))
- .fluidInputs(werkstoff.getMolten(576))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 4,
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Gear_Small.get(0))
- .itemOutputs(werkstoff.get(gearGtSmall))
- .fluidInputs(werkstoff.getMolten(144))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Bolt.get(0))
- .itemOutputs(werkstoff.get(bolt))
- .fluidInputs(werkstoff.getMolten(18))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 8,
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Ring.get(0))
- .itemOutputs(werkstoff.get(ring))
- .fluidInputs(werkstoff.getMolten(36))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() / 4,
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- // No Spring Molds
-
- if (WerkstoffLoader.rotorMold == null) {
- return;
- }
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Rotor.get(0))
- .itemOutputs(werkstoff.get(rotor))
- .fluidInputs(werkstoff.getMolten(612))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 4.25,
- 1L))
- .eut(
- werkstoff.getStats()
- .getMass() > 128 ? 64 : 30)
- .addTo(fluidSolidifierRecipes);
-
- }
-
- if (werkstoff.getGenerationFeatures()
- .hasMultipleMetalSolidifierRecipes() && !werkstoff.hasItemType(plateDouble)) {
- // No multiple plate molds
- return;
- }
-
- // Tank "Recipe"
- final FluidContainerRegistry.FluidContainerData data = new FluidContainerRegistry.FluidContainerData(
- new FluidStack(Objects.requireNonNull(WerkstoffLoader.molten.get(werkstoff)), 144),
- werkstoff.get(cellMolten),
- Materials.Empty.getCells(1));
- FluidContainerRegistry
- .registerFluidContainer(werkstoff.getMolten(144), werkstoff.get(cellMolten), Materials.Empty.getCells(1));
- GT_Utility.addFluidContainerData(data);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(Materials.Empty.getCells(1))
- .itemOutputs(werkstoff.get(cellMolten))
- .fluidInputs(new FluidStack(Objects.requireNonNull(WerkstoffLoader.molten.get(werkstoff)), 144))
- .duration(2 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(cellMolten))
- .itemOutputs(Materials.Empty.getCells(1))
- .fluidOutputs(new FluidStack(Objects.requireNonNull(WerkstoffLoader.molten.get(werkstoff)), 144))
- .duration(2 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- if (!Forestry.isModLoaded()) return;
-
- final FluidContainerRegistry.FluidContainerData emptyData = new FluidContainerRegistry.FluidContainerData(
- new FluidStack(Objects.requireNonNull(WerkstoffLoader.molten.get(werkstoff)), 144),
- werkstoff.get(capsuleMolten),
- GT_ModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1));
- FluidContainerRegistry.registerFluidContainer(
- werkstoff.getMolten(144),
- werkstoff.get(capsuleMolten),
- GT_ModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1));
- GT_Utility.addFluidContainerData(emptyData);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(capsuleMolten))
- .fluidOutputs(new FluidStack(Objects.requireNonNull(WerkstoffLoader.molten.get(werkstoff)), 144))
- .duration(2 * TICKS)
- .eut(2)
- .addTo(fluidCannerRecipes);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java
deleted file mode 100644
index 5975b7b898..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.plateDense;
-import static gregtech.api.enums.OrePrefixes.plateDouble;
-import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
-
-public class MultipleMetalLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(plateDense)) {
- RecipeMaps.benderRecipes.add(
- new GT_Recipe(
- true,
- new ItemStack[] { werkstoff.get(ingot, 2), GT_Utility.getIntegratedCircuit(2) },
- new ItemStack[] { werkstoff.get(plateDouble) },
- null,
- null,
- null,
- null,
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2,
- 1L),
- 60,
- 0));
- GregTech_API.registerCover(
- werkstoff.get(plateDouble),
- TextureFactory.of(werkstoff.getTexSet().mTextures[72], werkstoff.getRGBA(), false),
- null);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plateDouble))
- .itemOutputs(werkstoff.get(dust, 2))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java
deleted file mode 100644
index 8c9d3837c9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.crushed;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.ore;
-import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-
-public class OreLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(ore) && werkstoff.hasItemType(ingot)
- && !werkstoff.getStats()
- .isBlastFurnace())
- GT_ModHandler
- .addSmeltingRecipe(WerkstoffLoader.getCorrespondingItemStack(ore, werkstoff), werkstoff.get(ingot));
-
- if (werkstoff.hasItemType(ore)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ore))
- .itemOutputs(werkstoff.hasItemType(gem) ? werkstoff.get(gem) : werkstoff.get(crushed))
- .duration(16 * TICKS)
- .eut(10)
- .addTo(hammerRecipes);
-
- GT_ModHandler.addPulverisationRecipe(
- werkstoff.get(ore),
- werkstoff.get(crushed, 2),
- werkstoff.contains(SubTag.CRYSTAL) ? werkstoff.get(gem) : werkstoff.getOreByProduct(0, dust),
- werkstoff.getNoOfByProducts() > 0 ? 10 : 0,
- Materials.Stone.getDust(1),
- 50,
- true);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java
deleted file mode 100644
index 2fbb086022..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.crushed;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.rawOre;
-import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-
-public class RawOreLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(rawOre) && werkstoff.hasItemType(ingot)
- && !werkstoff.getStats()
- .isBlastFurnace())
- GT_ModHandler
- .addSmeltingRecipe(WerkstoffLoader.getCorrespondingItemStack(rawOre, werkstoff), werkstoff.get(ingot));
-
- if (werkstoff.hasItemType(rawOre)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(rawOre))
- .itemOutputs(werkstoff.hasItemType(gem) ? werkstoff.get(gem) : werkstoff.get(crushed))
- .duration(16 * TICKS)
- .eut(10)
- .addTo(hammerRecipes);
-
- GT_ModHandler.addPulverisationRecipe(
- werkstoff.get(rawOre),
- werkstoff.get(crushed, 2),
- werkstoff.contains(SubTag.CRYSTAL) ? werkstoff.get(gem) : werkstoff.getOreByProduct(0, dust),
- werkstoff.getNoOfByProducts() > 0 ? 5 : 0,
- Materials.Stone.getDust(1),
- 50,
- true);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java
deleted file mode 100644
index 88bfac24ee..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.block;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.dustSmall;
-import static gregtech.api.enums.OrePrefixes.foil;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.plate;
-import static gregtech.api.enums.OrePrefixes.stick;
-import static gregtech.api.enums.OrePrefixes.stickLong;
-import static gregtech.api.recipe.RecipeMaps.benderRecipes;
-import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
-import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
-import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.client.textures.PrefixTextureLinker;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.TextureSet;
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
-
-public class SimpleMetalLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- if (werkstoff.hasItemType(plate)) {
- if (werkstoff.hasItemType(gem)) {
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(gem))
- .itemOutputs(werkstoff.get(stick), werkstoff.get(dustSmall, 2))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 5L,
- 1L))
- .eut(16)
- .addTo(latheRecipes);
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(stick, 2),
- GT_Proxy.tBits,
- new Object[] { "s", "X", 'X', werkstoff.get(stickLong) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(stick),
- GT_Proxy.tBits,
- new Object[] { "f ", " X", 'X', werkstoff.get(gem) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stick, 2))
- .itemOutputs(werkstoff.get(stickLong))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L))
- .eut(16)
- .addTo(hammerRecipes);
-
- TextureSet texSet = werkstoff.getTexSet();
- ITexture texture = SideReference.Side.Client ? TextureFactory.of(
- texSet.mTextures[PrefixTextureLinker.blockTexMap.getOrDefault(texSet, block.mTextureIndex)],
- werkstoff.getRGBA(),
- false) : TextureFactory.of(texSet.mTextures[block.mTextureIndex], werkstoff.getRGBA(), false);
- GregTech_API.registerCover(werkstoff.get(plate), texture, null);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate))
- .itemOutputs(werkstoff.get(dust))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- return;
- }
-
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(stick, 2),
- GT_Proxy.tBits,
- new Object[] { "s", "X", 'X', werkstoff.get(stickLong) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(stick),
- GT_Proxy.tBits,
- new Object[] { "f ", " X", 'X', werkstoff.get(ingot) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(plate),
- GT_Proxy.tBits,
- new Object[] { "h", "X", "X", 'X', werkstoff.get(ingot) });
- GT_ModHandler.addCraftingRecipe(
- werkstoff.get(foil, 2),
- GT_Proxy.tBits,
- new Object[] { "hX", 'X', werkstoff.get(plate) });
-
- benderRecipes.add(
- new GT_Recipe(
- true,
- new ItemStack[] { werkstoff.get(ingot), GT_Utility.getIntegratedCircuit(1) },
- new ItemStack[] { werkstoff.get(plate) },
- null,
- null,
- null,
- null,
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L),
- 24,
- 0));
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 3))
- .itemOutputs(werkstoff.get(plate, 2))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L))
- .eut(16)
- .addTo(hammerRecipes);
-
- GregTech_API.registerCover(
- werkstoff.get(plate),
- TextureFactory.of(werkstoff.getTexSet().mTextures[71], werkstoff.getRGBA(), false),
- null);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot))
- .itemOutputs(werkstoff.get(stick), werkstoff.get(dustSmall, 2))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 5L,
- 1L))
- .eut(16)
- .addTo(latheRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate), GT_Utility.getIntegratedCircuit(1))
- .itemOutputs(werkstoff.get(foil, 4))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 1L,
- 1L))
- .eut(24)
- .addTo(benderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), GT_Utility.getIntegratedCircuit(10))
- .itemOutputs(werkstoff.get(foil, 4))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2L,
- 1L))
- .eut(24)
- .addTo(benderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stick, 2))
- .itemOutputs(werkstoff.get(stickLong))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass(),
- 1L))
- .eut(16)
- .addTo(hammerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), ItemList.Shape_Extruder_Plate.get(0))
- .itemOutputs(werkstoff.get(plate))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2L,
- 1L))
- .eut(45)
- .addTo(extruderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot), ItemList.Shape_Extruder_Rod.get(0))
- .itemOutputs(werkstoff.get(stick, 2))
- .duration(
- (int) Math.max(
- werkstoff.getStats()
- .getMass() * 2L,
- 1L))
- .eut(45)
- .addTo(extruderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot))
- .itemOutputs(werkstoff.get(dust))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plate))
- .itemOutputs(werkstoff.get(dust))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stickLong))
- .itemOutputs(werkstoff.get(dust))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(stick))
- .itemOutputs(werkstoff.get(dustSmall, 2))
- .duration(2 * TICKS)
- .eut(8)
- .addTo(maceratorRecipes);
-
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java
deleted file mode 100644
index 499477a846..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.recipe;
-
-import static gregtech.api.enums.OrePrefixes.bolt;
-import static gregtech.api.enums.OrePrefixes.cellMolten;
-import static gregtech.api.enums.OrePrefixes.gearGtSmall;
-import static gregtech.api.enums.OrePrefixes.gem;
-import static gregtech.api.enums.OrePrefixes.ingot;
-import static gregtech.api.enums.OrePrefixes.plate;
-import static gregtech.api.enums.OrePrefixes.plateDouble;
-import static gregtech.api.enums.OrePrefixes.ring;
-import static gregtech.api.enums.OrePrefixes.screw;
-import static gregtech.api.enums.OrePrefixes.stick;
-import static gregtech.api.enums.OrePrefixes.stickLong;
-import static gregtech.api.enums.OrePrefixes.toolHeadHammer;
-import static gregtech.api.enums.OrePrefixes.toolHeadSaw;
-import static gregtech.api.enums.OrePrefixes.toolHeadWrench;
-import static gregtech.api.enums.OrePrefixes.turbineBlade;
-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 net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-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.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.common.GT_Proxy;
-import gregtech.common.items.GT_MetaGenerated_Tool_01;
-
-public class ToolLoader implements IWerkstoffRunnable {
-
- // GTNH-Specific
- public static final short SCREWDRIVER_MV = 152;
- public static final short SCREWDRIVER_HV = 154;
- public static final short SOLDERING_IRON_MV = 162;
- public static final short SOLDERING_IRON_HV = 164;
-
- public void run(Werkstoff werkstoff) {
- if (werkstoff.getBridgeMaterial().mDurability == 0) return;
-
- if (werkstoff.hasItemType(gem)) {
- if (!werkstoff.getGenerationFeatures()
- .isExtension())
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.HARDHAMMER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial().mHandleMaterial,
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "XX ", "XXS", "XX ", 'X', gem.get(werkstoff.getBridgeMaterial()), 'S',
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- GT_ModHandler.addCraftingRecipe(
- GT_OreDictUnificator.get(toolHeadSaw, werkstoff.getBridgeMaterial(), 1L),
- GT_Proxy.tBits,
- new Object[] { "GGf", 'G', gem.get(werkstoff.getBridgeMaterial()) });
- }
-
- if (!werkstoff.hasItemType(plate)) return;
-
- // Disable recipe gen with handle Material for GT Materials
- if (!werkstoff.getGenerationFeatures()
- .isExtension()) {
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.SCREWDRIVER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial().mHandleMaterial,
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { " fS", " Sh", "W ", 'S', stick.get(werkstoff.getBridgeMaterial()), 'W',
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- GT_ModHandler.addCraftingRecipe(
- GT_OreDictUnificator.get(toolHeadWrench, werkstoff.getBridgeMaterial(), 1L),
- GT_Proxy.tBits,
- new Object[] { "hXW", "XRX", "WXd", 'X', plate.get(werkstoff.getBridgeMaterial()), 'S',
- plate.get(werkstoff.getBridgeMaterial().mHandleMaterial), 'R',
- ring.get(werkstoff.getBridgeMaterial().mHandleMaterial), 'W',
- screw.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- GT_ModHandler.addShapelessCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.HARDHAMMER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial().mHandleMaterial,
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { toolHeadHammer.get(werkstoff.getBridgeMaterial()),
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.FILE,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial().mHandleMaterial,
- null),
- GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
- | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "P", "P", "S", 'P', plate.get(werkstoff.getBridgeMaterial()), 'S',
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- GT_ModHandler.addShapelessCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.SAW,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial().mHandleMaterial,
- null),
- new Object[] { toolHeadSaw.get(werkstoff.getBridgeMaterial()),
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.SOLDERING_IRON_LV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', bolt.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(Materials.AnyRubber), 'S', stick.get(werkstoff.getBridgeMaterial().mHandleMaterial), 'L',
- ItemList.Battery_RE_LV_Lithium.get(1L) });
-
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SOLDERING_IRON_MV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', bolt.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(Materials.AnyRubber), 'S', stick.get(werkstoff.getBridgeMaterial().mHandleMaterial), 'L',
- ItemList.Battery_RE_MV_Lithium.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SOLDERING_IRON_HV,
- 1,
- werkstoff.getBridgeMaterial(),
- Materials.StyreneButadieneRubber,
- new long[] { 1600000L, 512L, 3L, -1L }),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "LBf", "Sd ", "P ", 'B', bolt.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(Materials.StyreneButadieneRubber), 'S',
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial), 'L',
- ItemList.Battery_RE_HV_Lithium.get(1L) });
-
- if (!werkstoff.hasItemType(gem)) {
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.HARDHAMMER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial().mHandleMaterial,
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "XX ", "XXS", "XX ", 'X', ingot.get(werkstoff.getBridgeMaterial()), 'S',
- stick.get(werkstoff.getBridgeMaterial().mHandleMaterial) });
- }
- }
-
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.PLUNGER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "xRR", " SR", "S f", 'S', stick.get(werkstoff.getBridgeMaterial()), 'R',
- plate.get(Materials.AnyRubber) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.WRENCH,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "IhI", "III", " I ", 'I', ingot.get(werkstoff.getBridgeMaterial()) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.CROWBAR,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "hDS", "DSD", "SDf", 'S', stick.get(werkstoff.getBridgeMaterial()), 'D', Dyes.dyeBlue });
-
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.WIRECUTTER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "PfP", "hPd", "STS", 'S', stick.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(werkstoff.getBridgeMaterial()), 'T', screw.get(werkstoff.getBridgeMaterial()) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.SCOOP,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "SWS", "SSS", "xSh", 'S', stick.get(werkstoff.getBridgeMaterial()), 'W',
- new ItemStack(Blocks.wool, 1, 32767) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.BRANCHCUTTER,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "PfP", "PdP", "STS", 'S', stick.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(werkstoff.getBridgeMaterial()), 'T', screw.get(werkstoff.getBridgeMaterial()) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.KNIFE,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "fPh", " S ", 'S', stick.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(werkstoff.getBridgeMaterial()) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.BUTCHERYKNIFE,
- 1,
- werkstoff.getBridgeMaterial(),
- werkstoff.getBridgeMaterial(),
- null),
- GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
- new Object[] { "PPf", "PP ", "Sh ", 'S', stick.get(werkstoff.getBridgeMaterial()), 'P',
- plate.get(werkstoff.getBridgeMaterial()) });
-
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.WRENCH_LV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_LV.get(1L), 'S', screw.get(Materials.Steel), 'P', plate.get(Materials.Steel),
- 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_LV.get(1L), 'S', screw.get(Materials.Steel), 'P', plate.get(Materials.Steel),
- 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_LV.get(1L), 'S', screw.get(Materials.Steel), 'P', plate.get(Materials.Steel),
- 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_MV.get(1L), 'S', screw.get(Materials.Aluminium), 'P',
- plate.get(Materials.Aluminium), 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_MV.get(1L), 'S', screw.get(Materials.Aluminium), 'P',
- plate.get(Materials.Aluminium), 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_MV.get(1L), 'S', screw.get(Materials.Aluminium), 'P',
- plate.get(Materials.Aluminium), 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_HV.get(1L), 'S', screw.get(Materials.StainlessSteel), 'P',
- plate.get(Materials.StainlessSteel), 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_HV.get(1L), 'S', screw.get(Materials.StainlessSteel), 'P',
- plate.get(Materials.StainlessSteel), 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', toolHeadWrench.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_HV.get(1L), 'S', screw.get(Materials.StainlessSteel), 'P',
- plate.get(Materials.StainlessSteel), 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_LV.get(1L), 'S', screw.get(Materials.Steel), 'P', plate.get(Materials.Steel),
- 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_LV.get(1L), 'S', screw.get(Materials.Steel), 'P', plate.get(Materials.Steel),
- 'G', 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,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_LV.get(1L), 'S', screw.get(Materials.Steel), 'P', plate.get(Materials.Steel),
- 'G', gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
-
- GT_ModHandler.addCraftingRecipe(
- GT_OreDictUnificator.get(toolHeadHammer, werkstoff.getBridgeMaterial(), 1L),
- GT_Proxy.tBits,
- new Object[] { "II ", "IIh", "II ", 'P', plate.get(werkstoff.getBridgeMaterial()), 'I',
- ingot.get(werkstoff.getBridgeMaterial()) });
- if (werkstoff.hasItemType(plateDouble) && werkstoff.hasItemType(cellMolten)) {
- GT_ModHandler.addCraftingRecipe(
- GT_OreDictUnificator.get(turbineBlade, werkstoff.getBridgeMaterial(), 1L),
- GT_Proxy.tBits,
- new Object[] { "fPd", "SPS", " P ", 'P', plateDouble.get(werkstoff.getBridgeMaterial()), 'S',
- screw.get(werkstoff.getBridgeMaterial()) });
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(ingot, 6), ItemList.Shape_Extruder_Turbine_Blade.get(0))
- .itemOutputs(werkstoff.get(turbineBlade, 1))
- .duration(
- (int) werkstoff.getStats()
- .getMass() / 2 * 20)
- .eut(TierEU.RECIPE_MV)
- .addTo(extruderRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(ItemList.Shape_Mold_Turbine_Blade.get(0))
- .itemOutputs(werkstoff.get(turbineBlade, 1))
- .fluidInputs(werkstoff.getMolten(864))
- .duration(
- (int) werkstoff.getStats()
- .getMass() * 20)
- .eut(TierEU.RECIPE_MV)
- .addTo(fluidSolidifierRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(plateDouble, 3), werkstoff.get(screw, 2))
- .itemOutputs(werkstoff.get(turbineBlade, 1))
- .duration(
- (werkstoff.getStats()
- .getMass() / 4) * SECONDS)
- .eut(TierEU.RECIPE_LV)
- .addTo(formingPressRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(turbineBlade, 4), GT_OreDictUnificator.get(stickLong, Materials.Magnalium, 1))
- .itemOutputs(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.TURBINE_SMALL,
- 1,
- werkstoff.getBridgeMaterial(),
- Materials.Magnalium,
- null))
- .duration(8 * SECONDS)
- .eut(100)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(werkstoff.get(turbineBlade, 8), GT_OreDictUnificator.get(stickLong, Materials.Titanium, 1))
- .itemOutputs(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.TURBINE,
- 1,
- werkstoff.getBridgeMaterial(),
- Materials.Titanium,
- null))
- .duration(16 * SECONDS)
- .eut(400)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- werkstoff.get(turbineBlade, 12),
- GT_OreDictUnificator.get(stickLong, Materials.TungstenSteel, 1))
- .itemOutputs(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.TURBINE_LARGE,
- 1,
- werkstoff.getBridgeMaterial(),
- Materials.TungstenSteel,
- null))
- .duration(32 * SECONDS)
- .eut(1600)
- .addTo(assemblerRecipes);
-
- GT_Values.RA.stdBuilder()
- .itemInputs(
- werkstoff.get(turbineBlade, 16),
- GT_OreDictUnificator.get(stickLong, Materials.Americium, 1))
- .itemOutputs(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- GT_MetaGenerated_Tool_01.TURBINE_HUGE,
- 1,
- werkstoff.getBridgeMaterial(),
- Materials.Americium,
- null))
- .duration(1 * MINUTES + 4 * SECONDS)
- .eut(6400)
- .addTo(assemblerRecipes);
- }
-
- if (!werkstoff.hasItemType(gem)) {
- GT_ModHandler.addCraftingRecipe(
- GT_OreDictUnificator.get(toolHeadSaw, werkstoff.getBridgeMaterial(), 1L),
- GT_Proxy.tBits,
- new Object[] { "PP ", "fh ", 'P', plate.get(werkstoff.getBridgeMaterial()), 'I',
- ingot.get(werkstoff.getBridgeMaterial()) });
- }
-
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SCREWDRIVER_MV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_MV.get(1L), 'S', screw.get(Materials.Aluminium), 'P',
- plate.get(Materials.Aluminium), 'G', gearGtSmall.get(Materials.Titanium), 'B',
- ItemList.Battery_RE_MV_Lithium.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SCREWDRIVER_MV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_MV.get(1L), 'S', screw.get(Materials.Aluminium), 'P',
- plate.get(Materials.Aluminium), 'G', gearGtSmall.get(Materials.Titanium), 'B',
- ItemList.Battery_RE_MV_Cadmium.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SCREWDRIVER_MV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_MV.get(1L), 'S', screw.get(Materials.Aluminium), 'P',
- plate.get(Materials.Aluminium), 'G', gearGtSmall.get(Materials.Titanium), 'B',
- ItemList.Battery_RE_MV_Sodium.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SCREWDRIVER_HV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_HV.get(1L), 'S', screw.get(Materials.StainlessSteel), 'P',
- plate.get(Materials.StainlessSteel), 'G', gearGtSmall.get(Materials.StainlessSteel), 'B',
- ItemList.Battery_RE_HV_Lithium.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SCREWDRIVER_HV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_HV.get(1L), 'S', screw.get(Materials.StainlessSteel), 'P',
- plate.get(Materials.StainlessSteel), 'G', gearGtSmall.get(Materials.StainlessSteel), 'B',
- ItemList.Battery_RE_HV_Cadmium.get(1L) });
- GT_ModHandler.addCraftingRecipe(
- GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
- SCREWDRIVER_HV,
- 1,
- werkstoff.getBridgeMaterial(),
- 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', stickLong.get(werkstoff.getBridgeMaterial()), 'M',
- ItemList.Electric_Motor_HV.get(1L), 'S', screw.get(Materials.StainlessSteel), 'P',
- plate.get(Materials.StainlessSteel), 'G', gearGtSmall.get(Materials.StainlessSteel), 'B',
- ItemList.Battery_RE_HV_Sodium.get(1L) });
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java
deleted file mode 100644
index c6eacb8ad2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.registration;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class AssociationLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- for (OrePrefixes prefixes : OrePrefixes.values()) {
- if (!werkstoff.hasItemType(prefixes)) continue;
-
- Materials werkstoffBridgeMaterial = werkstoff.getBridgeMaterial();
- ItemStack stack = WerkstoffLoader.getCorrespondingItemStackUnsafe(prefixes, werkstoff, 1);
-
- if (stack != null && stack.getItem() != null) {
- GT_OreDictUnificator.addAssociation(prefixes, werkstoffBridgeMaterial, stack, false);
- GT_OreDictUnificator.set(prefixes, werkstoffBridgeMaterial, stack, true, true);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java
deleted file mode 100644
index 5dafebb48e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.registration;
-
-import static gregtech.api.enums.Mods.Thaumcraft;
-import static gregtech.api.enums.OrePrefixes.cell;
-import static gregtech.api.enums.OrePrefixes.cellMolten;
-import static gregtech.api.enums.OrePrefixes.dust;
-import static gregtech.api.enums.OrePrefixes.values;
-
-import java.util.ArrayList;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enchants.Enchantment_Radioactivity;
-import gregtech.api.enums.Element;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class BridgeMaterialsLoader implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- // 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
- Materials werkstoffBridgeMaterial = werkstoff.getBridgeMaterial() != null ? werkstoff.getBridgeMaterial()
- : Materials.get(werkstoff.getVarName()) != Materials._NULL ? Materials.get(werkstoff.getVarName())
- : new Materials(
- -1,
- werkstoff.getTexSet(),
- werkstoff.getToolSpeed(),
- werkstoff.getDurability(),
- werkstoff.getToolQuality(),
- 0,
- werkstoff.getRGBA()[0],
- werkstoff.getRGBA()[1],
- werkstoff.getRGBA()[2],
- werkstoff.getRGBA()[3],
- werkstoff.getVarName(),
- werkstoff.getDefaultName(),
- 0,
- 0,
- werkstoff.getStats()
- .getMeltingPoint(),
- werkstoff.getStats()
- .getMeltingPoint(),
- werkstoff.getStats()
- .isBlastFurnace(),
- false,
- 0,
- 1,
- 1,
- null);
- for (OrePrefixes prefixes : values()) {
- if (prefixes != cell || !Werkstoff.Types.ELEMENT.equals(werkstoff.getType())) {
- if (prefixes == dust && Werkstoff.Types.ELEMENT.equals(werkstoff.getType())
- && Werkstoff.Types.ELEMENT.equals(werkstoff.getType())) {
- boolean ElementSet = false;
- for (Element e : Element.values()) {
- if (e.toString()
- .equals(werkstoff.getToolTip())) {
- if (!e.mLinkedMaterials.isEmpty()) break;
- werkstoffBridgeMaterial = werkstoff.getBridgeMaterial() != null
- ? werkstoff.getBridgeMaterial()
- : Materials.get(werkstoff.getVarName()) != Materials._NULL
- ? Materials.get(werkstoff.getVarName())
- : new Materials(
- -1,
- werkstoff.getTexSet(),
- werkstoff.getToolSpeed(),
- werkstoff.getDurability(),
- werkstoff.getToolQuality(),
- 0,
- werkstoff.getRGBA()[0],
- werkstoff.getRGBA()[1],
- werkstoff.getRGBA()[2],
- werkstoff.getRGBA()[3],
- werkstoff.getVarName(),
- werkstoff.getDefaultName(),
- 0,
- 0,
- werkstoff.getStats()
- .getMeltingPoint(),
- werkstoff.getStats()
- .getMeltingPoint(),
- werkstoff.getStats()
- .isBlastFurnace(),
- false,
- 0,
- 1,
- 1,
- null);
- werkstoffBridgeMaterial.mElement = e;
- e.mLinkedMaterials = new ArrayList<>();
- e.mLinkedMaterials.add(werkstoffBridgeMaterial);
- if (werkstoff.hasItemType(dust)) {
- GT_OreDictUnificator
- .addAssociation(dust, werkstoffBridgeMaterial, werkstoff.get(dust), false);
- GT_OreDictUnificator
- .set(dust, werkstoffBridgeMaterial, werkstoff.get(dust), true, true);
- }
- ElementSet = true;
- break;
- }
- }
- if (!ElementSet) {
- continue;
- }
- }
-
- if (werkstoff.hasItemType(cell)) {
- werkstoffBridgeMaterial.setHasCorrespondingFluid(true);
- werkstoffBridgeMaterial.setHasCorrespondingGas(true);
- werkstoffBridgeMaterial.mFluid = werkstoff.getFluidOrGas(1)
- .getFluid();
- werkstoffBridgeMaterial.mGas = werkstoff.getFluidOrGas(1)
- .getFluid();
- }
-
- if (werkstoff.hasItemType(cellMolten)) {
- werkstoffBridgeMaterial.mStandardMoltenFluid = werkstoff.getMolten(1)
- .getFluid();
- }
- werkstoffBridgeMaterial.mName = werkstoff.getVarName();
- werkstoffBridgeMaterial.mDefaultLocalName = werkstoff.getDefaultName();
- werkstoffBridgeMaterial.mChemicalFormula = werkstoff.getToolTip();
- if ("null".equals(werkstoffBridgeMaterial.mLocalizedName))
- // only reload from lang file if not localized already
- werkstoffBridgeMaterial.mLocalizedName = GT_LanguageManager.addStringLocalization(
- "Material." + werkstoffBridgeMaterial.mName.toLowerCase(),
- werkstoffBridgeMaterial.mDefaultLocalName);
- if (Thaumcraft.isModLoaded()) {
- werkstoffBridgeMaterial.mAspects = werkstoff.getGTWrappedTCAspects();
- }
- werkstoffBridgeMaterial.mMaterialInto = werkstoffBridgeMaterial;
- werkstoffBridgeMaterial.mHandleMaterial = werkstoff.contains(SubTag.BURNING) ? Materials.Blaze
- : werkstoff.contains(SubTag.MAGICAL) ? Materials.Thaumium
- : werkstoffBridgeMaterial.mDurability > 5120 ? Materials.TungstenSteel
- : werkstoffBridgeMaterial.mDurability > 1280 ? Materials.Steel : Materials.Wood;
- if (werkstoff.getStats()
- .isRadioactive()) {
- werkstoffBridgeMaterial.setEnchantmentForArmors(
- Enchantment_Radioactivity.INSTANCE,
- werkstoff.getStats()
- .getEnchantmentlvl());
- werkstoffBridgeMaterial.setEnchantmentForTools(
- Enchantment_Radioactivity.INSTANCE,
- werkstoff.getStats()
- .getEnchantmentlvl());
- }
- werkstoff.setBridgeMaterial(werkstoffBridgeMaterial);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java
deleted file mode 100644
index b2287b48b5..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.registration;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.material.werkstoff_loaders.IWerkstoffRunnable;
-
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class CasingRegistrator implements IWerkstoffRunnable {
-
- @Override
- public void run(Werkstoff werkstoff) {
- GT_OreDictUnificator.addAssociation(
- OrePrefixes.blockCasing,
- werkstoff.getBridgeMaterial(),
- new ItemStack(WerkstoffLoader.BWBlockCasings, 1, werkstoff.getmID()),
- false);
- GT_OreDictUnificator.addAssociation(
- OrePrefixes.blockCasingAdvanced,
- werkstoff.getBridgeMaterial(),
- new ItemStack(WerkstoffLoader.BWBlockCasingsAdvanced, 1, werkstoff.getmID()),
- false);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java
deleted file mode 100644
index 85f56cb7a9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.oredict;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.util.Pair;
-
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class OreDictAdder {
-
- private static final ConcurrentHashMap<String, ItemStack> toAddMap = new ConcurrentHashMap<>();
-
- public static synchronized void addToMap(Pair<String, ItemStack> element) {
- OreDictAdder.toAddMap.put(element.getKey(), element.getValue());
- }
-
- @SafeVarargs
- public static synchronized void addToMap(Pair<String, ItemStack>... elements) {
- for (Pair<String, ItemStack> p : elements) OreDictAdder.toAddMap.put(p.getKey(), p.getValue());
- }
-
- public static void addToOreDict() {
- for (Map.Entry<String, ItemStack> entry : OreDictAdder.toAddMap.entrySet()) {
- GT_OreDictUnificator.registerOre(entry.getKey(), entry.getValue());
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java
deleted file mode 100644
index 683b55b333..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.oredict;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-
-import net.minecraft.block.Block;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class OreDictHandler {
-
- private static final HashMap<String, Pair<Integer, Short>> cache = new HashMap<>();
- private static final HashSet<Pair<Integer, Short>> cacheNonBW = new HashSet<>();
-
- public static HashMap<String, Pair<Integer, Short>> getCache() {
- return OreDictHandler.cache;
- }
-
- public static HashSet<Pair<Integer, Short>> getNonBWCache() {
- return OreDictHandler.cacheNonBW;
- }
-
- public static void adaptCacheForWorld() {
- Set<String> used = new HashSet<>(OreDictHandler.cache.keySet());
- OreDictHandler.cache.clear();
- OreDictHandler.cacheNonBW.clear();
- for (String s : used) {
- if (!OreDictionary.getOres(s)
- .isEmpty()) {
- ItemStack tmpstack = OreDictionary.getOres(s)
- .get(0)
- .copy();
- Pair<Integer, Short> p = new Pair<>(
- Item.getIdFromItem(tmpstack.getItem()),
- (short) tmpstack.getItemDamage());
- OreDictHandler.cache.put(s, p);
- for (ItemStack tmp : OreDictionary.getOres(s)) {
- Pair<Integer, Short> p2 = new Pair<>(
- Item.getIdFromItem(tmp.getItem()),
- (short) tmp.getItemDamage());
- GameRegistry.UniqueIdentifier UI = GameRegistry.findUniqueIdentifierFor(tmp.getItem());
- if (UI == null) UI = GameRegistry.findUniqueIdentifierFor(Block.getBlockFromItem(tmp.getItem()));
- if (!MainMod.MOD_ID.equals(UI.modId) && !BartWorksCrossmod.MOD_ID.equals(UI.modId)
- && !"BWCore".equals(UI.modId)) {
- OreDictHandler.cacheNonBW.add(p2);
- }
- }
- }
- }
- }
-
- public static ItemStack getItemStack(String elementName, OrePrefixes prefixes, int amount) {
- if (OreDictHandler.cache.get(prefixes + elementName.replace(" ", "")) != null) {
- Pair<Integer, Short> p = OreDictHandler.cache.get(prefixes + elementName.replace(" ", ""));
- return new ItemStack(Item.getItemById(p.getKey()), amount, p.getValue());
- }
- if (!OreDictionary.getOres(prefixes + elementName.replace(" ", ""))
- .isEmpty()) {
- ItemStack tmp = GT_OreDictUnificator.get(
- OreDictionary.getOres(prefixes + elementName.replace(" ", ""))
- .get(0)
- .copy())
- .copy();
- OreDictHandler.cache.put(
- prefixes + elementName.replace(" ", ""),
- new Pair<>(Item.getIdFromItem(tmp.getItem()), (short) tmp.getItemDamage()));
- tmp.stackSize = amount;
- return tmp;
- }
- return null;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java
deleted file mode 100644
index 3305741f27..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.oregen;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.MathHelper;
-import net.minecraft.world.World;
-import net.minecraft.world.chunk.IChunkProvider;
-
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGeneratedOreTE;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Ores;
-import com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_SmallOres;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.MurmurHash3;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.google.common.collect.ArrayListMultimap;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.Materials;
-import gregtech.api.interfaces.ISubTagContainer;
-import gregtech.api.world.GT_Worldgen;
-import gregtech.common.blocks.GT_TileEntity_Ores;
-
-/**
- * Original GT File Stripped and adjusted to work with this mod
- */
-public abstract class BW_OreLayer extends GT_Worldgen {
-
- public static final List<BW_OreLayer> sList = new ArrayList<>();
- public static final ArrayListMultimap<Short, BW_OreLayer> NEIMAP = ArrayListMultimap.create();
- private static final boolean logOregenRoss128 = false;
- public static int sWeight;
- public byte bwOres;
- public int mMinY, mWeight, mDensity, mSize, mMaxY, mPrimaryMeta, mSecondaryMeta, mBetweenMeta, mSporadicMeta;
-
- public abstract Block getDefaultBlockToReplace();
-
- public abstract int[] getDefaultDamageToReplace();
-
- public abstract String getDimName();
-
- public BW_OreLayer(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity, int aSize,
- ISubTagContainer top, ISubTagContainer bottom, ISubTagContainer between, ISubTagContainer sprinkled) {
- super(aName, BW_OreLayer.sList, aDefault);
- this.mMinY = (short) aMinY;
- this.mMaxY = (short) aMaxY;
- this.mWeight = (short) aWeight;
- this.mDensity = (short) aDensity;
- this.mSize = (short) Math.max(1, aSize);
-
- if (this.mEnabled) BW_OreLayer.sWeight += this.mWeight;
-
- if (top instanceof Werkstoff) this.bwOres = (byte) (this.bwOres | 0b1000);
- if (bottom instanceof Werkstoff) this.bwOres = (byte) (this.bwOres | 0b0100);
- if (between instanceof Werkstoff) this.bwOres = (byte) (this.bwOres | 0b0010);
- if (sprinkled instanceof Werkstoff) this.bwOres = (byte) (this.bwOres | 0b0001);
-
- short aPrimary = top instanceof Materials ? (short) ((Materials) top).mMetaItemSubID
- : top instanceof Werkstoff ? ((Werkstoff) top).getmID() : 0;
- short aSecondary = bottom instanceof Materials ? (short) ((Materials) bottom).mMetaItemSubID
- : bottom instanceof Werkstoff ? ((Werkstoff) bottom).getmID() : 0;
- short aBetween = between instanceof Materials ? (short) ((Materials) between).mMetaItemSubID
- : between instanceof Werkstoff ? ((Werkstoff) between).getmID() : 0;
- short aSporadic = sprinkled instanceof Materials ? (short) ((Materials) sprinkled).mMetaItemSubID
- : sprinkled instanceof Werkstoff ? ((Werkstoff) sprinkled).getmID() : 0;
- this.mPrimaryMeta = aPrimary;
- this.mSecondaryMeta = aSecondary;
- this.mBetweenMeta = aBetween;
- this.mSporadicMeta = aSporadic;
- NEIMAP.put((short) this.mPrimaryMeta, this);
- NEIMAP.put((short) this.mSecondaryMeta, this);
- NEIMAP.put((short) this.mBetweenMeta, this);
- NEIMAP.put((short) this.mSporadicMeta, this);
- }
-
- public List<ItemStack> getStacks() {
- ArrayList<ItemStack> ret = new ArrayList<>();
- ret.add(
- (this.bwOres & 0b1000) != 0 ? new ItemStack(WerkstoffLoader.BWOres, 1, this.mPrimaryMeta)
- : new ItemStack(GregTech_API.sBlockOres1, 1, this.mPrimaryMeta));
- ret.add(
- (this.bwOres & 0b0100) != 0 ? new ItemStack(WerkstoffLoader.BWOres, 1, this.mSecondaryMeta)
- : new ItemStack(GregTech_API.sBlockOres1, 1, this.mSecondaryMeta));
- ret.add(
- (this.bwOres & 0b0010) != 0 ? new ItemStack(WerkstoffLoader.BWOres, 1, this.mBetweenMeta)
- : new ItemStack(GregTech_API.sBlockOres1, 1, this.mBetweenMeta));
- ret.add(
- (this.bwOres & 0b0001) != 0 ? new ItemStack(WerkstoffLoader.BWOres, 1, this.mSporadicMeta)
- : new ItemStack(GregTech_API.sBlockOres1, 1, this.mSporadicMeta));
- return ret;
- }
-
- public List<Pair<Integer, Boolean>> getStacksRawData() {
- ArrayList<Pair<Integer, Boolean>> ret = new ArrayList<>();
- ret.add(new Pair<>(this.mPrimaryMeta, (this.bwOres & 0b1000) != 0));
- ret.add(new Pair<>(this.mSecondaryMeta, (this.bwOres & 0b0100) != 0));
- ret.add(new Pair<>(this.mBetweenMeta, (this.bwOres & 0b0010) != 0));
- ret.add(new Pair<>(this.mSporadicMeta, (this.bwOres & 0b0001) != 0));
- return ret;
- }
-
- @Override
- public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
- int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
- {
- int tMinY = this.mMinY + aRandom.nextInt(this.mMaxY - this.mMinY - 5);
- int cX = aChunkX - aRandom.nextInt(this.mSize);
- int eX = aChunkX + 16 + aRandom.nextInt(this.mSize);
-
- boolean wasPlaced = false;
-
- for (int tX = cX; tX <= eX; ++tX) {
- int cZ = aChunkZ - aRandom.nextInt(this.mSize);
- int eZ = aChunkZ + 16 + aRandom.nextInt(this.mSize);
-
- for (int tZ = cZ; tZ <= eZ; ++tZ) {
- int i;
- if (this.mSecondaryMeta > 0) {
- for (i = tMinY - 1; i < tMinY + 2; ++i) {
- if (this.shouldPlace(aRandom, cX, eX, tX, cZ, eZ, tZ)) {
- wasPlaced = this.setOreBlock(aWorld, tX, i, tZ, this.mSecondaryMeta, false);
- }
- }
- }
-
- if (this.mBetweenMeta > 0 && this.shouldPlace(aRandom, cX, eX, tX, cZ, eZ, tZ)) {
- wasPlaced = this
- .setOreBlock(aWorld, tX, tMinY + 2 + aRandom.nextInt(2), tZ, this.mBetweenMeta, false);
- }
-
- if (this.mPrimaryMeta > 0) {
- for (i = tMinY + 3; i < tMinY + 6; ++i) {
- if (this.shouldPlace(aRandom, cX, eX, tX, cZ, eZ, tZ)) {
- wasPlaced = this.setOreBlock(aWorld, tX, i, tZ, this.mPrimaryMeta, false);
- }
- }
- }
-
- if (this.mSporadicMeta > 0 && this.shouldPlace(aRandom, cX, eX, tX, cZ, eZ, tZ)) {
- wasPlaced = this
- .setOreBlock(aWorld, tX, tMinY - 1 + aRandom.nextInt(7), tZ, this.mSporadicMeta, false);
- }
- }
- }
-
- if (BW_OreLayer.logOregenRoss128) {
- MainMod.LOGGER.info("Generated Orevein: " + this.mWorldGenName + " " + aChunkX + " " + aChunkZ);
- }
-
- return wasPlaced;
- }
- }
-
- private boolean shouldPlace(Random aRandom, int cX, int eX, int tX, int cZ, int eZ, int tZ) {
- if (aRandom.nextInt(
- Math.max(1, Math.max(MathHelper.abs_int(cZ - tZ), MathHelper.abs_int(eZ - tZ)) / this.mDensity)) == 0
- || aRandom.nextInt(
- Math.max(1, Math.max(MathHelper.abs_int(cX - tX), MathHelper.abs_int(eX - tX)) / this.mDensity)) == 0)
- return true;
- return false;
- }
-
- public boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre) {
- // security stuff to prevent crashes with 2 TileEntites on the same Spot
- TileEntity te = aWorld.getTileEntity(aX, aY, aZ);
- if (te instanceof BW_MetaGeneratedOreTE || te instanceof GT_TileEntity_Ores) return true;
-
- if (aMetaData == this.mSporadicMeta && (this.bwOres & 0b0001) != 0
- || aMetaData == this.mBetweenMeta && (this.bwOres & 0b0010) != 0
- || aMetaData == this.mPrimaryMeta && (this.bwOres & 0b1000) != 0
- || aMetaData == this.mSecondaryMeta && (this.bwOres & 0b0100) != 0) {
- return isSmallOre
- ? BW_MetaGenerated_SmallOres.setOreBlock(
- aWorld,
- aX,
- aY,
- aZ,
- aMetaData,
- false,
- this.getDefaultBlockToReplace(),
- this.getDefaultDamageToReplace())
- : BW_MetaGenerated_Ores.setOreBlock(
- aWorld,
- aX,
- aY,
- aZ,
- aMetaData,
- false,
- this.getDefaultBlockToReplace(),
- this.getDefaultDamageToReplace());
- }
-
- return this.setGTOreBlockSpace(aWorld, aX, aY, aZ, aMetaData, this.getDefaultBlockToReplace());
- }
-
- public boolean setGTOreBlockSpace(World aWorld, int aX, int aY, int aZ, int aMetaData, Block block) {
- if (GT_TileEntity_Ores.setOreBlock(aWorld, aX, aY, aZ, aMetaData, false, false)) return true;
- aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1));
- Block tBlock = aWorld.getBlock(aX, aY, aZ);
- Block tOreBlock = GregTech_API.sBlockOres1;
- if (aMetaData < 0 || tBlock == Blocks.air) {
- return false;
- } else {
- if (!tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, block)) {
- return false;
- }
- aMetaData += 5000;
- aWorld.setBlock(aX, aY, aZ, tOreBlock, aMetaData, 0);
- TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- if (tTileEntity instanceof GT_TileEntity_Ores ore) {
- ore.mMetaData = (short) aMetaData;
- }
- return true;
- }
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof BW_OreLayer that)) return false;
-
- if (this.bwOres != that.bwOres || this.mMinY != that.mMinY
- || this.mWeight != that.mWeight
- || this.mDensity != that.mDensity) return false;
- if (this.mSize != that.mSize) return false;
- if (this.mMaxY != that.mMaxY) return false;
- if (this.mPrimaryMeta != that.mPrimaryMeta) return false;
- if (this.mSecondaryMeta != that.mSecondaryMeta) return false;
- if (this.mBetweenMeta != that.mBetweenMeta) return false;
- return this.mSporadicMeta == that.mSporadicMeta;
- }
-
- @Override
- public int hashCode() {
- return MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(37)
- .put(this.bwOres)
- .putInt(this.mMinY)
- .putInt(this.mWeight)
- .putInt(this.mDensity)
- .putInt(this.mSize)
- .putInt(this.mMaxY)
- .putInt(this.mPrimaryMeta)
- .putInt(this.mSecondaryMeta)
- .putInt(this.mBetweenMeta)
- .putInt(this.mSporadicMeta)
- .array(),
- 0,
- 37,
- 31);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java
deleted file mode 100644
index 40c2302fb0..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.oregen;
-
-import java.util.HashSet;
-import java.util.Random;
-
-import net.minecraft.world.ChunkCoordIntPair;
-import net.minecraft.world.World;
-import net.minecraft.world.chunk.Chunk;
-import net.minecraft.world.chunk.IChunkProvider;
-
-import cpw.mods.fml.common.IWorldGenerator;
-import gregtech.api.objects.XSTR;
-import gregtech.api.util.GT_Log;
-
-/**
- * Original GT File Stripped and adjusted to work with this mod
- */
-public class BW_WordGenerator implements IWorldGenerator {
-
- public BW_WordGenerator() {
- // GT_NH Override... wont be actually registered to force its generation directly in the ChunkProvider
- // GameRegistry.registerWorldGenerator(this, 1073741823);
- }
-
- public synchronized void generate(Random aRandom, int aX, int aZ, World aWorld, IChunkProvider aChunkGenerator,
- IChunkProvider aChunkProvider) {
- new BW_WordGenerator.WorldGenContainer(
- aX * 16,
- aZ * 16,
- aWorld.provider.dimensionId,
- aWorld,
- aChunkGenerator,
- aChunkProvider).run();
- }
-
- public static class WorldGenContainer implements Runnable {
-
- public static HashSet<ChunkCoordIntPair> mGenerated = new HashSet<>(2000);
- public final int mDimensionType;
- public final World mWorld;
- public final IChunkProvider mChunkGenerator;
- public final IChunkProvider mChunkProvider;
- public int mX;
- public int mZ;
-
- public WorldGenContainer(int aX, int aZ, int aDimensionType, World aWorld, IChunkProvider aChunkGenerator,
- IChunkProvider aChunkProvider) {
- this.mX = aX;
- this.mZ = aZ;
- this.mDimensionType = aDimensionType;
- this.mWorld = aWorld;
- this.mChunkGenerator = aChunkGenerator;
- this.mChunkProvider = aChunkProvider;
- }
-
- // returns a coordinate of a center chunk of 3x3 square; the argument belongs to this square
- public int getVeinCenterCoordinate(int c) {
- c += c < 0 ? 1 : 3;
- return c - c % 3 - 2;
- }
-
- public boolean surroundingChunksLoaded(int xCenter, int zCenter) {
- return this.mWorld.checkChunksExist(xCenter - 16, 0, zCenter - 16, xCenter + 16, 0, zCenter + 16);
- }
-
- public XSTR getRandom(int xChunk, int zChunk) {
- long worldSeed = this.mWorld.getSeed();
- XSTR fmlRandom = new XSTR(worldSeed);
- long xSeed = fmlRandom.nextLong() >> 2 + 1L;
- long zSeed = fmlRandom.nextLong() >> 2 + 1L;
- long chunkSeed = xSeed * xChunk + zSeed * zChunk ^ worldSeed;
- fmlRandom.setSeed(chunkSeed);
- return new XSTR(fmlRandom.nextInt());
- }
-
- public void run() {
- int xCenter = this.getVeinCenterCoordinate(this.mX >> 4);
- int zCenter = this.getVeinCenterCoordinate(this.mZ >> 4);
- Random random = this.getRandom(xCenter, zCenter);
- xCenter <<= 4;
- zCenter <<= 4;
- ChunkCoordIntPair centerChunk = new ChunkCoordIntPair(xCenter, zCenter);
- if (!BW_WordGenerator.WorldGenContainer.mGenerated.contains(centerChunk)
- && this.surroundingChunksLoaded(xCenter, zCenter)) {
- BW_WordGenerator.WorldGenContainer.mGenerated.add(centerChunk);
- if (BW_OreLayer.sWeight > 0 && BW_OreLayer.sList.size() > 0) {
- boolean temp = true;
- int tRandomWeight;
- for (int i = 0; i < 256 && temp; i++) {
- tRandomWeight = random.nextInt(BW_OreLayer.sWeight);
- for (BW_OreLayer tWorldGen : BW_OreLayer.sList) {
- if (!tWorldGen.isGenerationAllowed(this.mWorld, this.mDimensionType, this.mDimensionType))
- continue;
- tRandomWeight -= tWorldGen.mWeight;
- if (tRandomWeight <= 0) {
- try {
- boolean placed;
- int attempts = 0;
- do {
- placed = tWorldGen.executeWorldgen(
- this.mWorld,
- random,
- "",
- this.mDimensionType,
- xCenter,
- zCenter,
- this.mChunkGenerator,
- this.mChunkProvider);
- ++attempts;
- } while (!placed && attempts < 25);
- temp = false;
- break;
- } catch (Throwable e) {
- e.printStackTrace(GT_Log.err);
- }
- }
- }
- }
- }
- }
- Chunk tChunk = this.mWorld.getChunkFromBlockCoords(this.mX, this.mZ);
- if (tChunk != null) {
- tChunk.isModified = true;
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java
deleted file mode 100644
index 6e0f0543e4..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.oregen;
-
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Arsenopyrite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Bismuthinit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Bismutite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Bornite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.ChromoAluminoPovondrait;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.DescloiziteCUVO4;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.DescloiziteZNVO4;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Djurleit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Fayalit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Ferberite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FluorBuergerit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Forsterit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FuchsitAL;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FuchsitCR;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Hedenbergit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Huebnerit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Loellingit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Olenit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RedZircon;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Roquesit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Thorianit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.VanadioOxyDravit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Wittichenit;
-import static com.github.bartimaeusnek.crossmod.galacticraft.GalacticraftProxy.uo_dimensionList;
-import static gregtech.api.enums.Materials.Bismuth;
-import static gregtech.api.enums.Materials.Coal;
-import static gregtech.api.enums.Materials.Diamond;
-import static gregtech.api.enums.Materials.Graphite;
-import static gregtech.api.enums.Materials.Lepidolite;
-import static gregtech.api.enums.Materials.Scheelite;
-import static gregtech.api.enums.Materials.Spodumene;
-import static gregtech.api.enums.Materials.Stibnite;
-import static gregtech.api.enums.Materials.Tetrahedrite;
-import static gregtech.api.enums.Materials.Uraninite;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-import net.minecraftforge.fluids.FluidRegistry;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-import gregtech.api.interfaces.ISubTagContainer;
-
-public class BW_WorldGenRoss128b extends BW_OreLayer {
-
- @Override
- public Block getDefaultBlockToReplace() {
- return Blocks.stone;
- }
-
- @Override
- public int[] getDefaultDamageToReplace() {
- return new int[] { 0 };
- }
-
- @Override
- public String getDimName() {
- return StatCollector.translateToLocal("planet.Ross128b");
- }
-
- public BW_WorldGenRoss128b(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity,
- int aSize, ISubTagContainer top, ISubTagContainer bottom, ISubTagContainer between,
- ISubTagContainer sprinkled) {
- super(aName, aDefault, aMinY, aMaxY, aWeight, aDensity, aSize, top, bottom, between, sprinkled);
- }
-
- public static void initOres() {
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.Thorianit",
- true,
- 30,
- 60,
- 17,
- 1,
- 16,
- Thorianit,
- Uraninite,
- Lepidolite,
- Spodumene);
- new BW_WorldGenRoss128b("ore.mix.ross128.carbon", true, 5, 25, 5, 4, 12, Graphite, Diamond, Coal, Graphite);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.bismuth",
- true,
- 5,
- 80,
- 30,
- 1,
- 16,
- Bismuthinit,
- Stibnite,
- Bismuth,
- Bismutite);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.TurmalinAlkali",
- true,
- 5,
- 80,
- 15,
- 4,
- 48,
- Olenit,
- FluorBuergerit,
- ChromoAluminoPovondrait,
- VanadioOxyDravit);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.Roquesit",
- true,
- 30,
- 50,
- 3,
- 1,
- 12,
- Arsenopyrite,
- Ferberite,
- Loellingit,
- Roquesit);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.Tungstate",
- true,
- 5,
- 40,
- 10,
- 4,
- 14,
- Ferberite,
- Huebnerit,
- Loellingit,
- Scheelite);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.CopperSulfits",
- true,
- 40,
- 70,
- 80,
- 3,
- 24,
- Djurleit,
- Bornite,
- Wittichenit,
- Tetrahedrite);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.Forsterit",
- true,
- 20,
- 90,
- 50,
- 2,
- 32,
- Forsterit,
- Fayalit,
- DescloiziteCUVO4,
- DescloiziteZNVO4);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.Hedenbergit",
- true,
- 20,
- 90,
- 50,
- 2,
- 32,
- Hedenbergit,
- Fayalit,
- DescloiziteCUVO4,
- DescloiziteZNVO4);
- new BW_WorldGenRoss128b(
- "ore.mix.ross128.RedZircon",
- true,
- 10,
- 80,
- 40,
- 3,
- 24,
- Fayalit,
- FuchsitAL,
- RedZircon,
- FuchsitCR);
- }
-
- public static void initundergroundFluids() {
- String ross128b = StatCollector.translateToLocal("planet.Ross128b");
- uo_dimensionList.SetConfigValues(ross128b, ross128b, "veryheavyoil", "liquid_extra_heavy_oil", 0, 625, 40, 5);
- uo_dimensionList
- .SetConfigValues(ross128b, ross128b, "lava", FluidRegistry.getFluidName(FluidRegistry.LAVA), 0, 820, 5, 5);
- uo_dimensionList.SetConfigValues(ross128b, ross128b, "gas_natural_gas", "gas_natural_gas", 0, 625, 65, 5);
- }
-
- @Override
- public boolean isGenerationAllowed(World aWorld, int aDimensionType, int aAllowedDimensionType) {
- return aDimensionType == ConfigHandler.ross128BID;
- }
-
- @Override
- public boolean isGenerationAllowed(String aDimName, int aDimensionType, int aAllowedDimensionType) {
- return aDimensionType == ConfigHandler.ross128BID;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java
deleted file mode 100644
index 7454b0dd93..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.oregen;
-
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.BArTiMaEuSNeK;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Bornite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.ChromoAluminoPovondrait;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Djurleit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Fayalit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Ferberite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FluorBuergerit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Fluorspar;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FuchsitAL;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FuchsitCR;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Hedenbergit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Huebnerit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Loellingit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Olenit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Prasiolite;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.RedZircon;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Tiberium;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.VanadioOxyDravit;
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.Wittichenit;
-import static com.github.bartimaeusnek.crossmod.galacticraft.GalacticraftProxy.uo_dimensionList;
-import static gregtech.api.enums.Materials.Amethyst;
-import static gregtech.api.enums.Materials.Barite;
-import static gregtech.api.enums.Materials.Galena;
-import static gregtech.api.enums.Materials.Helium_3;
-import static gregtech.api.enums.Materials.NaquadahEnriched;
-import static gregtech.api.enums.Materials.Olivine;
-import static gregtech.api.enums.Materials.SaltWater;
-import static gregtech.api.enums.Materials.Scheelite;
-import static gregtech.api.enums.Materials.Sphalerite;
-import static gregtech.api.enums.Materials.Tetrahedrite;
-
-import net.minecraft.block.Block;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-import gregtech.api.interfaces.ISubTagContainer;
-
-public class BW_WorldGenRoss128ba extends BW_OreLayer {
-
- public BW_WorldGenRoss128ba(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity,
- int aSize, ISubTagContainer top, ISubTagContainer bottom, ISubTagContainer between,
- ISubTagContainer sprinkled) {
- super(aName, aDefault, aMinY, aMaxY, aWeight, aDensity, aSize, top, bottom, between, sprinkled);
- }
-
- @Override
- public Block getDefaultBlockToReplace() {
- return Block.getBlockFromName("GalacticraftCore:tile.moonBlock");
- }
-
- @Override
- public int[] getDefaultDamageToReplace() {
- int[] ret = new int[12];
- for (int i = 0; i < 12; i++) {
- if (i != 5 && i != 3) ret[i] = i;
- }
- return ret;
- }
-
- @Override
- public String getDimName() {
- return StatCollector.translateToLocal("moon.Ross128ba");
- }
-
- public static void init_Ores() {
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.tib",
- true,
- 30,
- 60,
- 6,
- 1,
- 16,
- Tiberium,
- Tiberium,
- NaquadahEnriched,
- NaquadahEnriched);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.Tungstate",
- true,
- 5,
- 40,
- 60,
- 4,
- 14,
- Ferberite,
- Huebnerit,
- Loellingit,
- Scheelite);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.bart",
- true,
- 30,
- 60,
- 1,
- 1,
- 1,
- BArTiMaEuSNeK,
- BArTiMaEuSNeK,
- BArTiMaEuSNeK,
- BArTiMaEuSNeK);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.TurmalinAlkali",
- true,
- 5,
- 80,
- 60,
- 4,
- 48,
- Olenit,
- FluorBuergerit,
- ChromoAluminoPovondrait,
- VanadioOxyDravit);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.Amethyst",
- true,
- 5,
- 80,
- 35,
- 2,
- 8,
- Amethyst,
- Olivine,
- Prasiolite,
- Hedenbergit);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.CopperSulfits",
- true,
- 40,
- 70,
- 80,
- 3,
- 24,
- Djurleit,
- Bornite,
- Wittichenit,
- Tetrahedrite);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.RedZircon",
- true,
- 10,
- 80,
- 40,
- 3,
- 24,
- Fayalit,
- FuchsitAL,
- RedZircon,
- FuchsitCR);
- new BW_WorldGenRoss128ba(
- "ore.mix.ross128ba.Fluorspar",
- true,
- 10,
- 80,
- 35,
- 4,
- 8,
- Galena,
- Sphalerite,
- Fluorspar,
- Barite);
- }
-
- public static void init_undergroundFluids() {
- String ross128b = StatCollector.translateToLocal("moon.Ross128ba");
- uo_dimensionList.SetConfigValues(
- ross128b,
- ross128b,
- SaltWater.getFluid(1)
- .getFluid()
- .getName(),
- SaltWater.getFluid(1)
- .getFluid()
- .getName(),
- 0,
- 1250,
- 40,
- 5);
- uo_dimensionList.SetConfigValues(
- ross128b,
- ross128b,
- Helium_3.getGas(1)
- .getFluid()
- .getName(),
- Helium_3.getGas(1)
- .getFluid()
- .getName(),
- 0,
- 1250,
- 60,
- 5);
- }
-
- @Override
- public boolean isGenerationAllowed(World aWorld, int aDimensionType, int aAllowedDimensionType) {
- return aDimensionType == ConfigHandler.ross128BAID;
- }
-
- @Override
- public boolean isGenerationAllowed(String aDimName, int aDimensionType, int aAllowedDimensionType) {
- return aDimensionType == ConfigHandler.ross128BAID;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java
deleted file mode 100644
index 7d599b441a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.worldgen;
-
-import java.util.Random;
-
-import net.minecraft.block.Block;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-import gregtech.api.GregTech_API;
-
-public class GT_WorldgenUtil {
-
- private GT_WorldgenUtil() {}
-
- public static final Block GT_TILES = GregTech_API.sBlockMachines;
-
- public static short getGenerator(Random rand, int tier) {
- int meta = ConfigHandler.metasForTiers[0][tier][rand.nextInt(ConfigHandler.metasForTiers[0][tier].length)];
- return GregTech_API.METATILEENTITIES[meta] != null ? (short) meta : GT_WorldgenUtil.getGenerator(rand, tier);
- }
-
- public static short getBuffer(Random rand, int tier) {
- int meta = ConfigHandler.metasForTiers[1][tier][rand.nextInt(ConfigHandler.metasForTiers[1][tier].length)];
- return GregTech_API.METATILEENTITIES[meta] != null ? (short) meta : GT_WorldgenUtil.getBuffer(rand, tier);
- }
-
- public static short getCable(Random rand, int tier) {
- int meta = ConfigHandler.metasForTiers[2][tier][rand.nextInt(ConfigHandler.metasForTiers[2][tier].length)];
- return GregTech_API.METATILEENTITIES[meta] != null ? (short) meta : GT_WorldgenUtil.getCable(rand, tier);
- }
-
- public static short getMachine(Random rand, int tier) {
- int meta = ConfigHandler.metasForTiers[3][tier][rand.nextInt(ConfigHandler.metasForTiers[3][tier].length)];
- return GregTech_API.METATILEENTITIES[meta] != null ? (short) meta : GT_WorldgenUtil.getMachine(rand, tier);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java
deleted file mode 100644
index ef6b88cc5a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.system.worldgen;
-
-import static com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler.maxTierRoss;
-import static net.minecraftforge.common.ChestGenHooks.PYRAMID_JUNGLE_CHEST;
-
-import java.security.SecureRandom;
-import java.util.Random;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraft.inventory.IInventory;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.WeightedRandomChestContent;
-import net.minecraft.world.World;
-import net.minecraft.world.gen.feature.WorldGenerator;
-import net.minecraftforge.common.ChestGenHooks;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.util.Pair;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.BaseMetaPipeEntity;
-import gregtech.api.metatileentity.BaseMetaTileEntity;
-import gregtech.api.metatileentity.MetaPipeEntity;
-import gregtech.api.objects.XSTR;
-import gregtech.api.threads.GT_Runnable_MachineBlockUpdate;
-
-public abstract class MapGenRuins extends WorldGenerator {
-
- @SuppressWarnings("unchecked")
- protected Pair<Block, Integer>[][] ToBuildWith = new Pair[4][0];
-
- @Override
- public boolean generate(World p_76484_1_, Random p_76484_2_, int p_76484_3_, int p_76484_4_, int p_76484_5_) {
- return false;
- }
-
- @SuppressWarnings("unchecked")
- protected void setFloorBlocks(int[] metas, Block... blocks) {
- this.ToBuildWith[0] = new Pair[metas.length];
- for (int i = 0; i < metas.length; i++) {
- this.ToBuildWith[0][i] = new Pair<>(blocks[i % blocks.length], metas[i]);
- }
- }
-
- @SuppressWarnings("unchecked")
- protected void setWallBlocks(int[] metas, Block... blocks) {
- this.ToBuildWith[1] = new Pair[metas.length];
- for (int i = 0; i < metas.length; i++) {
- this.ToBuildWith[1][i] = new Pair<>(blocks[i % blocks.length], metas[i]);
- }
- }
-
- @SuppressWarnings("unchecked")
- protected void setRoofBlocks(int[] metas, Block... blocks) {
- this.ToBuildWith[2] = new Pair[metas.length];
- for (int i = 0; i < metas.length; i++) {
- this.ToBuildWith[2][i] = new Pair<>(blocks[i % blocks.length], metas[i]);
- }
- }
-
- @SuppressWarnings("unchecked")
- protected void setMiscBlocks(int[] metas, Block... blocks) {
- this.ToBuildWith[3] = new Pair[metas.length];
- for (int i = 0; i < metas.length; i++) {
- this.ToBuildWith[3][i] = new Pair<>(blocks[i % blocks.length], metas[i]);
- }
- }
-
- int[] statBlocks = new int[4];
-
- protected void setRandomBlockWAirChance(World worldObj, int x, int y, int z, Random rand, int airchance,
- Pair<Block, Integer>... blocks) {
- if (rand.nextInt(100) > airchance) this.setRandomBlock(worldObj, x, y, z, rand, blocks);
- else this.setBlock(worldObj, x, y, z, Blocks.air, 0);
- }
-
- protected void setRandomBlock(World worldObj, int x, int y, int z, Random rand, Pair<Block, Integer>... blocks) {
- Block toSet = blocks[rand.nextInt(blocks.length)].getKey();
- int meta = blocks[rand.nextInt(blocks.length)].getValue();
- this.setBlock(worldObj, x, y, z, toSet, meta);
- }
-
- protected void setBlock(World worldObj, int x, int y, int z, Block block, int meta) {
- this.setBlockAndNotifyAdequately(worldObj, x, y, z, block, meta);
- }
-
- protected void setBlock(World worldObj, int x, int y, int z, Pair<Block, Integer> pair) {
- this.setBlockAndNotifyAdequately(worldObj, x, y, z, pair.getKey(), pair.getValue());
- }
-
- private TileEntity setGTMachineBlock(World worldObj, int x, int y, int z, int meta) {
- boolean isEnabled = true;
- try {
- isEnabled = GT_Runnable_MachineBlockUpdate.isEnabled();
- } catch (Throwable ignored) {
- isEnabled = false;
- }
- if (isEnabled)
- throw new IllegalStateException("Machine Block Runnable needs to be disabled while creating world!");
- this.setBlockAndNotifyAdequately(
- worldObj,
- x,
- y,
- z,
- GT_WorldgenUtil.GT_TILES,
- GregTech_API.METATILEENTITIES[meta].getTileEntityBaseType());
- TileEntity tile = worldObj.getTileEntity(x, y, z);
- ((IGregTechTileEntity) tile).setInitialValuesAsNBT(null, (short) meta);
- return tile;
- }
-
- protected TileEntity reSetGTTileEntity(IGregTechTileEntity bte, World worldObj, int x, int y, int z, int meta) {
- worldObj.removeTileEntity(x, y, z);
- this.setBlock(worldObj, x, y, z, Blocks.air, 0);
- return this.setGTMachineBlock(worldObj, x, y, z, meta);
- }
-
- protected void setGTMachineBlockWChance(World worldObj, int x, int y, int z, Random rand, int airchance, int meta) {
- if (rand.nextInt(100) > airchance) {
- this.setGTMachineBlock(worldObj, x, y, z, meta);
- } else this.setBlock(worldObj, x, y, z, Blocks.air, 0);
- }
-
- protected void setGTCablekWChance(World worldObj, int x, int y, int z, Random rand, int airchance, int meta) {
- if (rand.nextInt(100) > airchance) {
- this.setGTCable(worldObj, x, y, z, meta);
- } else this.setBlock(worldObj, x, y, z, Blocks.air, 0);
- }
-
- protected void setGTMachine(World worldObj, int x, int y, int z, int meta, String ownerName,
- ForgeDirection facing) {
- try {
- GT_Runnable_MachineBlockUpdate.setDisabled();
- } catch (Throwable ignored) {}
- this.setGTMachineBlock(worldObj, x, y, z, meta);
- BaseMetaTileEntity BTE = (BaseMetaTileEntity) worldObj.getTileEntity(x, y, z);
- BTE.setOwnerName(ownerName);
- BTE.setFrontFacing(facing);
- BTE = (BaseMetaTileEntity) worldObj.getTileEntity(x, y, z);
- this.checkTile(BTE, worldObj, x, y, z, meta, ownerName, facing, 0);
- try {
- GT_Runnable_MachineBlockUpdate.setEnabled();
- } catch (Throwable ignored) {}
- }
-
- private void checkTile(BaseMetaTileEntity BTE, World worldObj, int x, int y, int z, int meta, String ownerName,
- ForgeDirection facing, int depth) {
- if (depth < 25) {
- if (BTE.getMetaTileID() != meta || worldObj.getTileEntity(x, y, z) != BTE || BTE.isInvalid()) {
- this.redoTile(BTE, worldObj, x, y, z, meta, ownerName, facing);
- this.checkTile(BTE, worldObj, x, y, z, meta, ownerName, facing, depth);
- depth++;
- }
- } else {
- worldObj.removeTileEntity(x, y, z);
- worldObj.setBlockToAir(x, y, z);
- }
- }
-
- private void redoTile(BaseMetaTileEntity BTE, World worldObj, int x, int y, int z, int meta, String ownerName,
- ForgeDirection facing) {
- this.reSetGTTileEntity(BTE, worldObj, x, y, z, meta);
- BTE = (BaseMetaTileEntity) worldObj.getTileEntity(x, y, z);
- BTE.setOwnerName(ownerName);
- BTE.setFrontFacing(facing);
- }
-
- protected void setGTCable(World worldObj, int x, int y, int z, int meta) {
- try {
- GT_Runnable_MachineBlockUpdate.setDisabled();
- } catch (Throwable ignored) {}
- BaseMetaPipeEntity BTE = (BaseMetaPipeEntity) this.setGTMachineBlock(worldObj, x, y, z, meta);
- MetaPipeEntity MPE = (MetaPipeEntity) BTE.getMetaTileEntity();
- BTE.mConnections |= (byte) (1 << (byte) 4);
- BTE.mConnections |= (byte) (1 << ForgeDirection.getOrientation(4)
- .getOpposite()
- .ordinal());
- BaseMetaTileEntity BPE = (BaseMetaTileEntity) worldObj.getTileEntity(x, y, z - 1);
- if (BPE != null) {
- BTE.mConnections |= (byte) (1 << (byte) 2);
- }
- MPE.mConnections = BTE.mConnections;
- try {
- GT_Runnable_MachineBlockUpdate.setEnabled();
- } catch (Throwable ignored) {}
- }
-
- public static class RuinsBase extends MapGenRuins {
-
- private static final String owner = "Ancient Cultures";
-
- @Override
- public boolean generate(World worldObj, Random rand1, int x, int y, int z) {
-
- for (int i = 0; i < rand1.nextInt(144); i++) {
- rand1.nextLong();
- }
-
- Random rand = new XSTR(rand1.nextLong());
- SecureRandom secureRandom = new SecureRandom();
-
- if (worldObj.getBlock(x, y, z) == Blocks.air) {
- while (worldObj.getBlock(x, y, z) == Blocks.air) {
- y--;
- }
- }
-
- this.setFloorBlocks(new int[] { 0, 0, 0 }, Blocks.brick_block, Blocks.double_stone_slab, Blocks.stonebrick);
- this.setWallBlocks(new int[] { 0, 1, 2, 1, 1 }, Blocks.stonebrick);
- this.setRoofBlocks(new int[] { 9 }, Blocks.log);
- this.setMiscBlocks(new int[] { 1 }, Blocks.log);
- this.statBlocks = new int[] { rand.nextInt(this.ToBuildWith[0].length) };
- int colored = rand.nextInt(15);
- int tier = secureRandom.nextInt(maxTierRoss);
- boolean useColor = rand.nextBoolean();
- byte set = 0;
- byte toSet = (byte) (rand.nextInt(maxTierRoss - tier) + 1);
- short cablemeta = GT_WorldgenUtil.getCable(secureRandom, tier);
- byte treeinaRow = 0;
- boolean lastset = rand.nextBoolean();
- for (int dx = -6; dx <= 6; dx++) {
- for (int dy = 0; dy <= 8; dy++) {
- for (int dz = -6; dz <= 6; dz++) {
- this.setBlock(worldObj, x + dx, y + dy, z + dz, Blocks.air, 0);
- if (dy == 0) {
- Pair<Block, Integer> floor = this.ToBuildWith[0][this.statBlocks[0]];
- this.setBlock(worldObj, x + dx, y + 0, z + dz, floor.getKey(), floor.getValue());
- } else if (dy > 0 && dy < 4) {
- if (Math.abs(dx) == 5 && Math.abs(dz) == 5) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 5,
- this.ToBuildWith[3][0]);
- } else if (dx == 0 && dz == -5 && (dy == 1 || dy == 2)) {
- if (dy == 1) {
- this.setBlock(worldObj, x + dx, y + 1, z + -5, Blocks.iron_door, 1);
- }
- if (dy == 2) {
- this.setBlock(worldObj, x + dx, y + 2, z + dz, Blocks.iron_door, 8);
- }
- } else if (Math.abs(dx) == 5 && Math.abs(dz) < 5 || Math.abs(dz) == 5 && Math.abs(dx) < 5) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[1]);
- if (dy == 2 && rand.nextInt(100) < 12) {
- if (useColor) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 2,
- z + dz,
- rand,
- 25,
- new Pair<>(Blocks.stained_glass_pane, colored));
- }
- } else {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 25,
- new Pair<>(Blocks.glass_pane, 0));
- }
- }
-
- if (dy == 3 && Math.abs(dx) == 6) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 3,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[2]);
- }
-
- if (dy == 1) {
- if (dx == 3 && dz == -3) {
- this.setBlock(worldObj, x + 3, y + 1, z + dz, Blocks.crafting_table, 0);
- }
- if (dx == -3 && (dz == -3 || dz == -2)) {
- this.setBlock(worldObj, x + -3, y + dy, z + dz, Blocks.chest, 5);
- IInventory chest = (IInventory) worldObj.getTileEntity(x + dx, y + dy, z + dz);
- if (chest != null) {
- WeightedRandomChestContent.generateChestContents(
- secureRandom,
- ChestGenHooks.getItems(PYRAMID_JUNGLE_CHEST, rand),
- chest,
- ChestGenHooks.getCount(PYRAMID_JUNGLE_CHEST, rand));
- }
- }
-
- if (dx == 4 && dz == 4) {
- short meta = GT_WorldgenUtil.getGenerator(secureRandom, tier);
- this.setGTMachine(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- meta,
- owner,
- tier > 0 ? ForgeDirection.WEST : ForgeDirection.UP);
- } else if (dx == 3 && dz == 4) {
- if (tier > 0) {
- short meta = GT_WorldgenUtil.getBuffer(secureRandom, tier);
- this.setGTMachine(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- meta,
- owner,
- ForgeDirection.WEST);
- } else {
- this.setGTCablekWChance(worldObj, x + dx, y + dy, z + dz, rand, 33, cablemeta);
- }
- } else if (dx < 3 && dx > -5 && dz == 4) {
- this.setGTCablekWChance(worldObj, x + dx, y + dy, z + dz, rand, 33, cablemeta);
- } else if (dx < 3 && dx > -5 && dz == 3 && set < toSet) {
- if (!lastset || treeinaRow > 2) {
- short meta = GT_WorldgenUtil.getMachine(secureRandom, tier);
- this.setGTMachine(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- meta,
- owner,
- ForgeDirection.UP);
-
- set++;
- treeinaRow = 0;
- lastset = true;
- } else {
- lastset = rand.nextBoolean();
- if (lastset) treeinaRow++;
- }
- }
- }
- } else switch (dy) {
- case 4:
- if (Math.abs(dx) == 5) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 4,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[2]);
- break;
- }
- if (Math.abs(dz) == 5 && Math.abs(dx) < 5) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[1]);
- }
- break;
- case 5:
- if (Math.abs(dx) == 4) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 5,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[2]);
- break;
- }
- if (Math.abs(dz) == 5 && Math.abs(dx) < 4) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[1]);
- }
- break;
- case 6:
- if (Math.abs(dx) == 3) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 6,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[2]);
- break;
- }
- if (Math.abs(dz) == 5 && Math.abs(dx) < 3) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[1]);
- }
- break;
- case 7:
- if (Math.abs(dx) == 2) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 7,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[2]);
- break;
- }
- if (Math.abs(dz) == 5 && Math.abs(dx) < 2) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + dy,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[1]);
- }
- break;
- case 8:
- if (Math.abs(dx) == 1 || Math.abs(dx) == 0) {
- this.setRandomBlockWAirChance(
- worldObj,
- x + dx,
- y + 8,
- z + dz,
- rand,
- 25,
- this.ToBuildWith[2]);
- }
- break;
- default:
- break;
- }
- }
- }
- }
- tosetloop: while (set < toSet) {
- int dy = 1;
- int dz = 3;
- for (int dx = 2; dx > -5; dx--) {
- if (set >= toSet) {
- break tosetloop;
- }
- if (!lastset || treeinaRow > 2 && worldObj.getTileEntity(x + dx, y + dy, z + dz) == null) {
- short meta = GT_WorldgenUtil.getMachine(secureRandom, tier);
- this.setGTMachine(worldObj, x + dx, y + dy, z + dz, meta, owner, ForgeDirection.UP);
-
- set++;
- treeinaRow = 0;
- lastset = true;
- } else {
- lastset = rand.nextBoolean();
- if (lastset) {
- treeinaRow++;
- }
- }
- }
- }
- return true;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java
deleted file mode 100644
index aec0972a67..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import static com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps.bacterialVatRecipes;
-import static com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps.bioLabRecipes;
-import static com.github.bartimaeusnek.bartworks.API.recipe.BartWorksRecipeMaps.radioHatchRecipes;
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.calculateSv;
-import static com.github.bartimaeusnek.bartworks.util.BW_Util.specialToByte;
-
-import javax.annotation.Nonnegative;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.BioItemList;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.Materials;
-import gregtech.api.util.GT_Recipe;
-
-@SuppressWarnings("UnusedReturnValue")
-public class BWRecipes {
-
- public static final BWRecipes instance = new BWRecipes();
-
- public static long calcDecayTicks(int x) {
- long ret;
- if (x == 43) ret = 5000;
- else if (x == 61) ret = 4500;
- else if (x <= 100) ret = MathUtils.ceilLong((8000D * Math.tanh(-x / 20D) + 8000D) * 1000D);
- else ret = MathUtils.ceilLong(8000D * Math.tanh(-x / 65D) + 8000D);
- return ret;
- }
-
- public boolean addRadHatch(ItemStack item, int radioLevel, int amount, short[] rgba) {
- return radioHatchRecipes.addRecipe(
- new GT_Recipe(
- false,
- new ItemStack[] { item },
- null,
- null,
- new int[] { rgba[0], rgba[1], rgba[2] },
- null,
- null,
- amount,
- radioLevel,
- (int) calcDecayTicks(radioLevel)))
- != null;
- }
-
- public boolean addBioLabRecipe(ItemStack[] aInputs, ItemStack aOutput, ItemStack aSpecialItems, int[] aChances,
- FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) {
- return bioLabRecipes.addRecipe(
- new GT_Recipe(
- true,
- aInputs,
- new ItemStack[] { aOutput },
- aSpecialItems,
- aChances,
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- aSpecialValue))
- != null;
- }
-
- public boolean addBioLabRecipeIncubation(ItemStack aInput, BioCulture aOutput, int[] aChances,
- FluidStack[] aFluidInputs, int aDuration, int aEUt, int aSpecialValue) {
- return bioLabRecipes.addRecipe(
- new GT_Recipe(
- true,
- new ItemStack[] { BioItemList.getPetriDish(null), aInput },
- new ItemStack[] { BioItemList.getPetriDish(aOutput) },
- null,
- aChances,
- aFluidInputs,
- new FluidStack[] { GT_Values.NF },
- aDuration,
- aEUt,
- aSpecialValue))
- != null;
- }
-
- public boolean addBioLabRecipeIncubation(ItemStack aInput, BioCulture aOutput, int[] aChances,
- FluidStack aFluidInputs, int aDuration, int aEUt, int aSpecialValue) {
- return bioLabRecipes.addRecipe(
- new GT_Recipe(
- true,
- new ItemStack[] { BioItemList.getPetriDish(null), aInput },
- new ItemStack[] { BioItemList.getPetriDish(aOutput) },
- null,
- aChances,
- new FluidStack[] { aFluidInputs },
- new FluidStack[] { GT_Values.NF },
- aDuration,
- aEUt,
- aSpecialValue))
- != null;
- }
-
- public boolean addBacterialVatRecipe(ItemStack[] aInputs, BioCulture aCulture, FluidStack[] aFluidInputs,
- FluidStack[] aFluidOutputs, @Nonnegative int aDuration, @Nonnegative int aEUt, @Nonnegative int aSv,
- @Nonnegative int glasTier, int aSpecialValue, boolean exactSv) {
- int aSievert = 0;
- if (aSv >= 83 || aSv == 61 || aSv == 43) aSievert += aSv;
- aSievert = aSievert << 1;
- aSievert = aSievert | (exactSv ? 1 : 0);
- aSievert = aSievert << 2;
- aSievert = aSievert | specialToByte(aSpecialValue);
- aSievert = aSievert << 4;
- aSievert = aSievert | glasTier;
- return bacterialVatRecipes.addRecipe(
- new GT_Recipe(
- false,
- aInputs,
- null,
- BioItemList.getPetriDish(aCulture),
- new int[] {},
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- aSievert))
- != null;
- }
-
- @Deprecated
- public boolean addBacterialVatRecipe(ItemStack[] aInputs, BioCulture aCulture, FluidStack[] aFluidInputs,
- FluidStack[] aFluidOutputs, int aDuration, int aEUt, Materials material, @Nonnegative int glasTier,
- int aSpecialValue, boolean exactSv) {
- byte gTier = (byte) glasTier;
- int aSievert = 0;
- if (material.getProtons() >= 83 || material.getProtons() == 61 || material.getProtons() == 43)
- aSievert += calculateSv(material);
- aSievert = aSievert << 1;
- aSievert = aSievert | (exactSv ? 1 : 0);
- aSievert = aSievert << 2;
- aSievert = aSievert | specialToByte(aSpecialValue);
- aSievert = aSievert << 4;
- aSievert = aSievert | gTier;
- return bacterialVatRecipes.addRecipe(
- new GT_Recipe(
- false,
- aInputs,
- null,
- BioItemList.getPetriDish(aCulture),
- new int[] {},
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- aSievert))
- != null;
- }
-
- /**
- * Adds a Vat recipe without Rad requirements but with Glas requirements
- */
- public boolean addBacterialVatRecipe(ItemStack[] aInputs, BioCulture culture, FluidStack[] aFluidInputs,
- FluidStack[] aFluidOutputs, int aDuration, int aEUt, byte glasTier) {
- int aSievert = 0;
- aSievert = aSievert | glasTier;
- return bacterialVatRecipes.addRecipe(
- new GT_Recipe(
- false,
- aInputs,
- null,
- BioItemList.getPetriDish(culture),
- new int[] {},
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- aSievert))
- != null;
- }
-
- /**
- * Adds a Vat recipe without Rad or Glas requirements
- */
- public boolean addBacterialVatRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, BioCulture culture,
- FluidStack[] aFluidOutputs, int aDuration, int aEUt) {
- return bacterialVatRecipes.addRecipe(
- new GT_Recipe(
- false,
- aInputs,
- null,
- BioItemList.getPetriDish(culture),
- new int[] {},
- aFluidInputs,
- aFluidOutputs,
- aDuration,
- aEUt,
- 0))
- != null;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java
deleted file mode 100644
index 2e384c8e0c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.Arrays;
-
-import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
-
-@SuppressWarnings("unused")
-public class BW_ColorUtil {
-
- private BW_ColorUtil() {}
-
- public static byte getDarknessFromColor(short[] rgba, int index) {
- int g = rgba[index];
- if (g >= 0 && g < 64) return 0;
- if (g >= 64 && g < 160) return 1;
- else if (g >= 160 && g < 223) return 2;
- else if (g >= 233 && g <= 255) return 3;
- return 4;
- }
-
- public static Dyes getDyeFromColor(short[] rgba) {
- rgba = correctCorlorArray(rgba);
- if (isGrayScale(rgba, 2)) {
- switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- return Dyes.dyeBlack;
- case 1:
- return Dyes.dyeGray;
- case 2:
- return Dyes.dyeLightGray;
- case 3:
- return Dyes.dyeWhite;
- }
- } else {
- short[] tmp = roundColor(rgba, 2);
- if (isRedScale(tmp)) {
- if (isPurpleScale(tmp)) {
- switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- if (rgba[3] - 50 > rgba[0]) return Dyes.dyePurple;
- else return Dyes.dyeRed;
- case 2:
- case 3:
- if (rgba[3] - 50 > rgba[0]) return Dyes.dyeMagenta;
- else if (rgba[0] > 200 && rgba[2] > 140) return Dyes.dyePink;
- else if (rgba[0] > rgba[1] + rgba[1] / 10 && rgba[0] > rgba[2] + rgba[2] / 10
- && rgba[1] >> 4 == rgba[2] >> 4
- && rgba[1] + 50 > rgba[0]) {
- return Dyes.dyeBrown;
- } else return Dyes.dyeRed;
- case 4:
- return Dyes._NULL;
- }
- }
- if (isYellowScale(tmp)) switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- return Dyes.dyeBrown;
- case 2:
- case 3: {
- if (rgba[0] >> 5 > rgba[1] >> 5) return Dyes.dyeOrange;
- else return Dyes.dyeYellow;
- }
- case 4:
- return Dyes._NULL;
- }
- return Dyes.dyePink;
- }
- if (isGrenScale(tmp)) {
- if (isCyanScale(tmp)) {
- if (rgba[2] + 40 < rgba[1]) switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- return Dyes.dyeGreen;
- case 2:
- case 3:
- return Dyes.dyeLime;
- }
- return Dyes.dyeCyan;
- }
- if (isYellowScale(tmp)) switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- return Dyes.dyeBrown;
- case 2:
- case 3: {
- if (rgba[0] >> 5 > rgba[1] >> 5) return Dyes.dyeOrange;
- else return Dyes.dyeYellow;
- }
- }
- switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- return Dyes.dyeGreen;
- case 2:
- case 3:
- return Dyes.dyeLime;
- }
- } else if (isBlueScale(tmp)) {
- if (isPurpleScale(tmp)) {
- switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- return Dyes.dyePurple;
- case 2:
- case 3:
- return Dyes.dyeMagenta;
- }
- } else if (isCyanScale(tmp)) {
- return Dyes.dyeCyan;
- }
- switch (getDarknessFromColor(rgba, 0)) {
- case 0:
- case 1:
- return Dyes.dyeBlue;
- case 2:
- case 3:
- return Dyes.dyeLightBlue;
- }
- }
- }
- return Dyes._NULL;
- }
-
- public static boolean isCyanScale(short[] rgba) {
- return !isRedScale(rgba);
- }
-
- public static boolean isPurpleScale(short[] rgba) {
- return !isGrenScale(rgba);
- }
-
- public static boolean isYellowScale(short[] rgba) {
- return !isBlueScale(rgba);
- }
-
- public static boolean isBlueScale(short[] rgba) {
- rgba = correctCorlorArray(rgba);
- return rgba[2] * 2 >= rgba[1] + rgba[0];
- }
-
- public static boolean isGrenScale(short[] rgba) {
- rgba = correctCorlorArray(rgba);
- return rgba[1] * 2 >= rgba[0] + rgba[2];
- }
-
- public static boolean isRedScale(short[] rgba) {
- rgba = correctCorlorArray(rgba);
- return rgba[0] * 2 >= rgba[1] + rgba[2];
- }
-
- public static boolean isGrayScale(short[] rgba, int magin) {
- rgba = correctCorlorArray(rgba);
- return rgba[0] >> magin == rgba[1] >> magin && rgba[1] >> magin == rgba[2] >> magin;
- }
-
- public static short[] roundColor(short[] rgba, int magin) {
- short[] tmp = Arrays.copyOf(rgba, 4);
- tmp[0] = (short) (rgba[0] >> magin);
- tmp[1] = (short) (rgba[1] >> magin);
- tmp[2] = (short) (rgba[2] >> magin);
- return tmp;
- }
-
- public static boolean isGrayScale(short[] rgba) {
- rgba = correctCorlorArray(rgba);
- return rgba[0] == rgba[1] && rgba[1] == rgba[2];
- }
-
- public static short[] correctCorlorArray(short[] rgba) {
- if (rgba.length > 4) {
- rgba = Arrays.copyOfRange(rgba, 0, 4);
- }
- if (rgba.length < 4) {
- short[] tmp = Arrays.copyOf(rgba, 4);
- Arrays.fill(tmp, rgba.length, 4, (short) 0);
- rgba = tmp;
- }
- if (rgba[0] > 255) rgba[0] = 255;
- if (rgba[1] > 255) rgba[1] = 255;
- if (rgba[2] > 255) rgba[2] = 255;
- if (rgba[3] > 255) rgba[3] = 255;
- if (rgba[0] < 0) rgba[0] = 0;
- if (rgba[1] < 0) rgba[1] = 0;
- if (rgba[2] < 0) rgba[2] = 0;
- if (rgba[3] < 0) rgba[3] = 0;
- return rgba;
- }
-
- public static short[] splitColorToRBGArray(int rgb) {
- return new short[] { (short) (rgb >> 16 & 0xFF), (short) (rgb >> 8 & 0xFF), (short) (rgb & 0xFF) };
- }
-
- public static int getColorFromRGBArray(short[] color) {
- return (color[0] & 0x0ff) << 16 | (color[1] & 0x0ff) << 8 | color[2] & 0x0ff;
- }
-
- public static int getColorFromRGBArray(int[] color) {
- return (color[0] & 0x0ff) << 16 | (color[1] & 0x0ff) << 8 | color[2] & 0x0ff;
- }
-
- public static String getColorForTier(int tier) {
- return GT_Values.TIER_COLORS[tier];
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java
deleted file mode 100644
index b68f3fb437..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import static net.minecraft.util.EnumChatFormatting.BLUE;
-import static net.minecraft.util.EnumChatFormatting.DARK_BLUE;
-import static net.minecraft.util.EnumChatFormatting.GRAY;
-import static net.minecraft.util.EnumChatFormatting.GREEN;
-
-import java.util.function.Function;
-import java.util.function.Supplier;
-
-import net.minecraft.util.StatCollector;
-
-public class BW_Tooltip_Reference {
-
- public static final String BW_NO_RESET = ChatColorHelper.DARKGREEN + "BartWorks";
- public static final String TT_NO_RESET = BLUE + "Tec" + DARK_BLUE + "Tech";
- public static final String BW = BW_NO_RESET + GRAY;
- public static final String TT = TT_NO_RESET + GRAY;
-
- public static final Supplier<String> ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS = () -> StatCollector.translateToLocal(
- "tooltip.bw.1.name") + " " + BW;
- public static final Supplier<String> ADDED_BY_BARTWORKS = () -> StatCollector.translateToLocal("tooltip.bw.0.name")
- + " "
- + BW;
- public static final Function<String, String> ADDED_VIA_BARTWORKS = owner -> String
- .format(StatCollector.translateToLocal("tooltip.bw.via.name"), owner);
- public static final String MULTIBLOCK_ADDED_BY_BARTWORKS = BW;
- public static final Function<String, String> MULTIBLOCK_ADDED_VIA_BARTWORKS = owner -> String
- .format(StatCollector.translateToLocal("tooltip.bw.mb_via.name"), owner);
- public static final String MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS = MULTIBLOCK_ADDED_VIA_BARTWORKS
- .apply(GREEN + "bartimaeusnek");
-
- public static final String ADV_STR_CHECK = "Uses an advanced " + TT + " structure check, due to " + BW;
- public static final String TT_BLUEPRINT = "To see the structure, use a " + TT + " Blueprint on the Controller!";
-
- public static String[] getTranslatedBrandedTooltip(String key) {
- String[] dsc = StatCollector.translateToLocal(key)
- .split(";");
- String[] fdsc = new String[dsc.length + 1];
- System.arraycopy(dsc, 0, fdsc, 0, dsc.length);
- fdsc[dsc.length] = ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get();
- return fdsc;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java
deleted file mode 100644
index 38982f35b3..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java
+++ /dev/null
@@ -1,803 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import static gregtech.api.enums.GT_Values.D1;
-import static gregtech.api.enums.GT_Values.E;
-import static gregtech.api.enums.GT_Values.M;
-import static gregtech.api.enums.GT_Values.VN;
-import static gregtech.api.enums.GT_Values.W;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-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.function.BiConsumer;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.enchantment.Enchantment;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.EnumRarity;
-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.world.World;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.oredict.OreDictionary;
-import net.minecraftforge.oredict.ShapedOreRecipe;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-import com.github.bartimaeusnek.bartworks.API.BioVatLogicAdder;
-import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.gtnewhorizon.structurelib.StructureLibAPI;
-import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
-import com.gtnewhorizon.structurelib.structure.IStructureElement;
-
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OreDictNames;
-import gregtech.api.enums.ToolDictNames;
-import gregtech.api.interfaces.IItemContainer;
-import gregtech.api.objects.ItemData;
-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_Shaped_Recipe;
-import gregtech.api.util.GT_Utility;
-
-public class BW_Util {
-
- public static final int STANDART = 0;
- public static final int LOWGRAVITY = -100;
- public static final int CLEANROOM = -200;
-
- public static String translateGTItemStack(ItemStack itemStack) {
- if (!GT_Utility.isStackValid(itemStack)) return "Not a Valid ItemStack:" + itemStack;
- String ret = GT_LanguageManager.getTranslation(GT_LanguageManager.getTranslateableItemStackName(itemStack));
- if (!ret.contains("%material")) return ret;
- String matname = "";
- if (BW_Util.checkStackAndPrefix(itemStack))
- matname = GT_OreDictUnificator.getAssociation(itemStack).mMaterial.mMaterial.mDefaultLocalName;
- return ret.replace("%material", matname);
- }
-
- public static void set2DCoordTo1DArray(int indexX, int indexY, int sizeY, Object value, Object[] array) {
- int index = indexX * sizeY + indexY;
- array[index] = value;
- }
-
- public static Object get2DCoordFrom1DArray(int indexX, int indexY, int sizeY, Object[] array) {
- int index = indexX * sizeY + indexY;
- return array[index];
- }
-
- public static GT_Recipe copyAndSetTierToNewRecipe(GT_Recipe recipe, byte tier) {
- byte oldTier = GT_Utility.getTier(recipe.mEUt);
- int newTime = recipe.mDuration;
- int newVoltage = recipe.mEUt;
- if (tier < oldTier) {
- newTime <<= oldTier - tier;
- newVoltage >>= 2 * (oldTier - tier);
- } else {
- newTime >>= tier - oldTier;
- newVoltage <<= 2 * (tier - oldTier);
- }
- recipe.mEUt = newVoltage;
- recipe.mDuration = newTime;
- return recipe;
- }
-
- public static String subscriptNumbers(String b) {
- char[] chars = b.toCharArray();
- char[] nu = new char[chars.length];
- for (int i = 0; i < chars.length; i++) {
- nu[i] = switch (chars[i]) {
- case '0' -> '\u2080';
- case '1' -> '\u2081';
- case '2' -> '\u2082';
- case '3' -> '\u2083';
- case '4' -> '\u2084';
- case '5' -> '\u2085';
- case '6' -> '\u2086';
- case '7' -> '\u2087';
- case '8' -> '\u2088';
- case '9' -> '\u2089';
- default -> chars[i];
- };
- }
- return new String(nu);
- }
-
- public static String subscriptNumber(Number b) {
- char[] chars = Long.toString(b.longValue())
- .toCharArray();
- char[] nu = new char[chars.length];
- for (int i = 0; i < chars.length; i++) {
- nu[i] = switch (chars[i]) {
- case '0' -> '\u2080';
- case '1' -> '\u2081';
- case '2' -> '\u2082';
- case '3' -> '\u2083';
- case '4' -> '\u2084';
- case '5' -> '\u2085';
- case '6' -> '\u2086';
- case '7' -> '\u2087';
- case '8' -> '\u2088';
- case '9' -> '\u2089';
- default -> chars[i];
- };
- }
- return new String(nu);
- }
-
- public static String superscriptNumbers(String b) {
- char[] chars = b.toCharArray();
- char[] nu = new char[chars.length];
- for (int i = 0; i < chars.length; i++) {
- nu[i] = switch (chars[i]) {
- case '0' -> '\u2070';
- case '1' -> '\u2071';
- case '2' -> '\u00B2';
- case '3' -> '\u00B3';
- case '4' -> '\u2074';
- case '5' -> '\u2075';
- case '6' -> '\u2076';
- case '7' -> '\u2077';
- case '8' -> '\u2078';
- case '9' -> '\u2079';
- default -> chars[i];
- };
- }
- return new String(nu);
- }
-
- public static String superscriptNumber(Number b) {
- char[] chars = Long.toString(b.longValue())
- .toCharArray();
- char[] nu = new char[chars.length];
- for (int i = 0; i < chars.length; i++) {
- nu[i] = switch (chars[i]) {
- case '0' -> '\u2070';
- case '1' -> '\u2071';
- case '2' -> '\u00B2';
- case '3' -> '\u00B3';
- case '4' -> '\u2074';
- case '5' -> '\u2075';
- case '6' -> '\u2076';
- case '7' -> '\u2077';
- case '8' -> '\u2078';
- case '9' -> '\u2079';
- default -> chars[i];
- };
- }
- return new String(nu);
- }
-
- public static byte specialToByte(int aSpecialValue) {
- byte special = 0;
- switch (aSpecialValue) {
- case LOWGRAVITY:
- special = 1;
- break;
- case CLEANROOM:
- special = 2;
- break;
- case LOWGRAVITY | CLEANROOM:
- special = 3;
- break;
- default:
- break;
- }
- return special;
- }
-
- public static int calculateSv(Materials materials) {
- for (BioVatLogicAdder.MaterialSvPair pair : BioVatLogicAdder.RadioHatch.getMaSv()) {
- if (pair.getMaterials()
- .equals(materials)) return pair.getSievert();
- }
- return (int) (materials.getProtons() == 43L
- ? materials.equals(Materials.NaquadahEnriched) ? 140
- : materials.equals(Materials.Naquadria) ? 150 : materials.equals(Materials.Naquadah) ? 130 : 43
- : materials.getProtons());
- }
-
- public static ItemStack setStackSize(ItemStack stack, int size) {
- if (stack != null) stack.stackSize = size;
- return stack;
- }
-
- public static boolean checkStackAndPrefix(ItemStack itemStack) {
- return itemStack != null && GT_OreDictUnificator.getAssociation(itemStack) != null
- && GT_OreDictUnificator.getAssociation(itemStack).mPrefix != null
- && GT_OreDictUnificator.getAssociation(itemStack).mMaterial != null
- && GT_OreDictUnificator.getAssociation(itemStack).mMaterial.mMaterial != null;
- }
-
- public static int abstractHashGTRecipe(GT_Recipe recipe) {
- int hash = 31;
- hash += recipe.mDuration / 20 * 31;
- hash += GT_Utility.getTier(recipe.mEUt) * 31;
- hash += BW_Util.specialToByte(recipe.mSpecialValue) * 31;
- hash += recipe.mInputs.length * 31;
- for (ItemStack mInput : recipe.mInputs) {
- if (mInput != null) {
- hash += mInput.stackSize * 31;
- hash += Item.getIdFromItem(mInput.getItem()) * 31;
- }
- }
- hash += recipe.mOutputs.length * 31;
- for (ItemStack mOutput : recipe.mOutputs) {
- if (mOutput != null) {
- hash += mOutput.stackSize * 31;
- hash += Item.getIdFromItem(mOutput.getItem()) * 31;
- }
- }
- hash += recipe.mFluidInputs.length * 31;
- for (FluidStack mInput : recipe.mFluidInputs) {
- if (mInput != null) {
- hash += mInput.amount * 31;
- hash += mInput.getFluidID() * 31;
- }
- }
- hash += recipe.mFluidOutputs.length * 31;
- for (FluidStack mOutput : recipe.mFluidOutputs) {
- if (mOutput != null) {
- hash += mOutput.amount * 31;
- hash += mOutput.getFluidID() * 31;
- }
- }
- return hash;
- }
-
- @SuppressWarnings({ "unchecked" })
- public static <T> T[] copyAndRemoveNulls(T[] input, Class<T> clazz) {
- List<T> ret = Arrays.stream(input)
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
-
- if (ret.size() <= 0) return (T[]) Array.newInstance(clazz, 0);
-
- T[] retArr = (T[]) Array.newInstance(clazz, ret.size());
-
- for (int i = 0; i < ret.size(); i++) retArr[i] = ret.get(i);
-
- return retArr;
- }
-
- @Deprecated
- public static int getMachineVoltageFromTier(int tier) {
- return (int) (30 * Math.pow(4, tier - 1));
- }
-
- public static long getTierVoltage(int tier) {
- return getTierVoltage((byte) tier);
- }
-
- public static long getTierVoltage(byte tier) {
- return 8L << 2 * tier;
- }
-
- public static byte getTier(long voltage) {
- if (voltage <= Integer.MAX_VALUE - 7) return GT_Utility.getTier(voltage);
- byte t = 0;
- while (voltage > 8L) {
- voltage >>= 2;
- t++;
- }
- return t;
- }
-
- public static String getTierName(byte tier) {
- if (VN.length - 1 <= tier) return "MAX+";
- return VN[tier];
- }
-
- public static String getTierNameFromVoltage(long voltage) {
- return getTierName(getTier(voltage));
- }
-
- public static boolean areStacksEqualOrNull(ItemStack aStack1, ItemStack aStack2) {
- return aStack1 == null && aStack2 == null || GT_Utility.areStacksEqual(aStack1, aStack2);
- }
-
- public static boolean areStacksEqualOrEachNull(ItemStack aStack1, ItemStack aStack2) {
- return aStack1 == null || aStack2 == null || GT_Utility.areStacksEqual(aStack1, aStack2);
- }
-
- public static byte getByteFromRarity(EnumRarity rarity) {
- if (EnumRarity.uncommon.equals(rarity)) return 1;
- if (EnumRarity.epic.equals(rarity)) return 2;
- else if (EnumRarity.rare.equals(rarity)) return 3;
- return 0;
- }
-
- /**
- * @deprecated Use stuff in {@link com.github.bartimaeusnek.bartworks.API.BorosilicateGlass} instead
- */
- @Deprecated
- public static byte getTierFromGlasMeta(int meta) {
- return switch (meta) {
- case 1 -> 4;
- case 2, 12 -> 5;
- case 3 -> 6;
- case 4 -> 7;
- case 5 -> 8;
- case 13 -> 9;
- case 14 -> 10;
- default -> 3;
- };
- }
-
- public static EnumRarity getRarityFromByte(byte b) {
- return switch (b) {
- case 1 -> EnumRarity.uncommon;
- case 2 -> EnumRarity.rare;
- case 3 -> EnumRarity.epic;
- default -> EnumRarity.common;
- };
- }
-
- public static byte getCircuitTierFromOreDictName(String name) {
- return switch (name) {
- case "circuitPrimitive" -> 0;
- case "circuitBasic" -> 1;
- case "circuitGood" -> 2;
- case "circuitAdvanced" -> 3;
- case "circuitData" -> 4;
- case "circuitElite" -> 5;
- case "circuitMaster" -> 6;
- case "circuitUltimate" -> 7;
- case "circuitSuperconductor" -> 8;
- case "circuitInfinite" -> 9;
- case "circuitBio" -> 10;
- case "circuitNano", "circuitOptical" -> 11;
- case "circuitPiko", "circuitExotic" -> 12;
- case "circuitQuantum", "circuitCosmic" -> 13;
- case "circuitTranscendent" -> 14;
- default -> -1;
- };
- }
-
- public static byte getCircuitTierFromItemStack(ItemStack stack) {
- for (String oreName : getOreNames(stack)) {
- byte tier = getCircuitTierFromOreDictName(oreName);
- if (tier != -1) {
- return tier;
- }
- }
- return -1;
- }
-
- public static boolean isTieredCircuit(ItemStack stack) {
- return getCircuitTierFromItemStack(stack) != -1;
- }
-
- public static List<String> getOreNames(ItemStack stack) {
- List<String> ret = new ArrayList<>();
- for (int oreID : OreDictionary.getOreIDs(stack)) {
- ret.add(OreDictionary.getOreName(oreID));
- }
- return ret;
- }
-
- public static byte calculateGlassTier(@Nonnull Block block, @Nonnegative byte meta) {
-
- byte boroTier = BorosilicateGlass.getTier(block, meta);
- if (boroTier != -1) return boroTier;
-
- if ("blockAlloyGlass".equals(block.getUnlocalizedName())) return 4;
-
- if (block.equals(Blocks.glass)) return 3;
-
- for (BioVatLogicAdder.BlockMetaPair B : BioVatLogicAdder.BioVatGlass.getGlassMap()
- .keySet())
- if (B.getBlock()
- .equals(block)
- && B.getaByte()
- .equals(meta))
- return BioVatLogicAdder.BioVatGlass.getGlassMap()
- .get(B);
-
- if (block.getMaterial()
- .equals(Material.glass)) return 3;
-
- return 0;
- }
-
- public static <T> IStructureElement<T> ofGlassTiered(byte mintier, byte maxtier, byte notset,
- BiConsumer<T, Byte> setter, Function<T, Byte> getter, int aDots) {
- return new IStructureElement<>() {
-
- private final IStructureElement<T> placementDelegate = BorosilicateGlass
- .ofBoroGlass(notset, mintier, maxtier, setter, getter);
-
- @Override
- public boolean check(T te, World world, int x, int y, int z) {
- if (world.isAirBlock(x, y, z)) return false;
- byte glasstier = BW_Util
- .calculateGlassTier(world.getBlock(x, y, z), (byte) world.getBlockMetadata(x, y, z));
- // is not a glass ?
- if (glasstier == 0 || glasstier == notset || glasstier < mintier || glasstier > maxtier) return false;
- if (getter.apply(te) == notset) setter.accept(te, glasstier);
- return getter.apply(te) == glasstier;
- }
-
- @Override
- public boolean spawnHint(T te, World world, int x, int y, int z, ItemStack itemStack) {
- StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), aDots - 1);
- return true;
- }
-
- @Override
- public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
- return this.placementDelegate.placeBlock(t, world, x, y, z, trigger);
- }
-
- @Override
- public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
- AutoPlaceEnvironment env) {
- return this.placementDelegate.survivalPlaceBlock(t, world, x, y, z, trigger, env);
- }
- };
- }
-
- public static <T> IStructureElement<T> ofGlassTieredMixed(byte mintier, byte maxtier, int aDots) {
- return new IStructureElement<>() {
-
- private final IStructureElement<T> placementDelegate = BorosilicateGlass
- .ofBoroGlass((byte) 0, mintier, maxtier, (v1, v2) -> {}, v1 -> (byte) 0);
-
- @Override
- public boolean check(T te, World world, int x, int y, int z) {
- if (world.isAirBlock(x, y, z)) return false;
- byte glasstier = BW_Util
- .calculateGlassTier(world.getBlock(x, y, z), (byte) world.getBlockMetadata(x, y, z));
- if (glasstier == 0) return false; // is not a glass ?
- return glasstier >= mintier && glasstier <= maxtier;
- }
-
- @Override
- public boolean spawnHint(T te, World world, int x, int y, int z, ItemStack itemStack) {
- StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), aDots - 1);
- return true;
- }
-
- @Override
- public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
- return this.placementDelegate.placeBlock(t, world, x, y, z, trigger);
- }
-
- @Override
- public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
- AutoPlaceEnvironment env) {
- return this.placementDelegate.survivalPlaceBlock(t, world, x, y, z, trigger, env);
- }
- };
- }
-
- private static Field sBufferedRecipeList;
-
- @SuppressWarnings("unchecked")
- public static List<IRecipe> getGTBufferedRecipeList()
- throws SecurityException, IllegalArgumentException, IllegalAccessException {
- if (sBufferedRecipeList == null) {
- sBufferedRecipeList = FieldUtils.getDeclaredField(GT_ModHandler.class, "sBufferRecipeList", true);
- }
- if (sBufferedRecipeList == null) {
- sBufferedRecipeList = FieldUtils.getField(GT_ModHandler.class, "sBufferRecipeList", true);
- }
- return (List<IRecipe>) sBufferedRecipeList.get(null);
- }
-
- public static ShapedOreRecipe createGTCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) {
- return createGTCraftingRecipe(
- aResult,
- new Enchantment[0],
- new int[0],
- (aBitMask & GT_ModHandler.RecipeBits.MIRRORED) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.BUFFERED) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.KEEPNBT) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.DISMANTLEABLE) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.NOT_REMOVABLE) == 0L,
- (aBitMask & GT_ModHandler.RecipeBits.REVERSIBLE) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_NATIVE_RECIPES) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS) == 0L,
- (aBitMask & GT_ModHandler.RecipeBits.ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT) != 0L,
- (aBitMask & GT_ModHandler.RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL) != 0L,
- aRecipe);
- }
-
- public static ShapedOreRecipe createGTCraftingRecipe(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 null;
- if (aResult != null && Items.feather.getDamage(aResult) == W) Items.feather.setDamage(aResult, 0);
- if (aRecipe == null || aRecipe.length <= 0) return null;
-
- boolean tThereWasARecipe = false;
-
- for (byte i = 0; i < aRecipe.length; i++) {
- if (aRecipe[i] instanceof IItemContainer itemContainer) {
- aRecipe[i] = itemContainer.get(1);
- continue;
- }
- if (aRecipe[i] instanceof Enum<?>enum_) {
- aRecipe[i] = enum_.name();
- continue;
- }
- 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 string) {
- StringBuilder s = new StringBuilder(string);
- 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());
- break;
- case 'c':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolCrowbar.name());
- break;
- case 'd':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolScrewdriver.name());
- break;
- case 'f':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolFile.name());
- break;
- case 'h':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolHardHammer.name());
- break;
- case 'i':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolSolderingIron.name());
- break;
- case 'j':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolSolderingMetal.name());
- break;
- case 'k':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolKnife.name());
- break;
- case 'm':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolMortar.name());
- break;
- case 'p':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolDrawplate.name());
- break;
- case 'r':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolSoftHammer.name());
- break;
- case 's':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolSaw.name());
- break;
- case 'w':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolWrench.name());
- break;
- case 'x':
- tRecipeList.add(c);
- tRecipeList.add(ToolDictNames.craftingToolWireCutter.name());
- break;
- }
- }
- }
-
- 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 null;
- }
- Character chr = (Character) aRecipe[idx];
- Object in = aRecipe[idx + 1];
- if (in instanceof ItemStack) {
- tItemStackMap.put(chr, GT_Utility.copy(in));
- tItemDataMap.put(chr, GT_OreDictUnificator.getItemData((ItemStack) in));
- } else if (in instanceof ItemData) {
- String tString = in.toString();
- switch (tString) {
- case "plankWood":
- tItemDataMap.put(chr, new ItemData(Materials.Wood, M));
- break;
- case "stoneNetherrack":
- tItemDataMap.put(chr, new ItemData(Materials.Netherrack, M));
- break;
- case "stoneObsidian":
- tItemDataMap.put(chr, new ItemData(Materials.Obsidian, M));
- break;
- case "stoneEndstone":
- tItemDataMap.put(chr, new ItemData(Materials.Endstone, M));
- break;
- default:
- tItemDataMap.put(chr, (ItemData) in);
- break;
- }
- ItemStack tStack = GT_OreDictUnificator.getFirstOre(in, 1);
- if (tStack == null) tRemoveRecipe = false;
- else tItemStackMap.put(chr, tStack);
- 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()) {
- x++;
- 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()) {
- x++;
- tRecipe[x] = tItemStackMap.get(chr);
- if (tRecipe[x] != null && Items.feather.getDamage(tRecipe[x]) == W)
- Items.feather.setDamage(tRecipe[x], 0);
- }
- tThereWasARecipe = GT_ModHandler.removeRecipe(tRecipe) != null;
- }
- } catch (Throwable e) {
- e.printStackTrace(GT_Log.err);
- }
-
- if (aResult == null || aResult.stackSize <= 0) return null;
-
- if (aRemoveAllOthersWithSameOutput || aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT
- || aRemoveAllOtherShapedsWithSameOutput
- || aRemoveAllOtherNativeRecipes)
- tThereWasARecipe = GT_ModHandler.removeRecipeByOutput(
- aResult,
- !aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT,
- aRemoveAllOtherShapedsWithSameOutput,
- aRemoveAllOtherNativeRecipes) || tThereWasARecipe;
-
- if (aOnlyAddIfThereIsAnyRecipeOutputtingThis && !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 (GT_ModHandler.sSpecialRecipeClasses.contains(
- tRecipe.getClass()
- .getName()))
- continue;
- if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tRecipe.getRecipeOutput()), aResult, true)) {
- tList.remove(i);
- 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);
-
- return new GT_Shaped_Recipe(
- GT_Utility.copy(aResult),
- aDismantleable,
- aRemovable,
- aKeepNBT,
- aEnchantmentsAdded,
- aEnchantmentLevelsAdded,
- aRecipe).setMirrored(aMirrored);
- }
-
- public static void shortSleep(long nanos) {
- try {
- long start = System.nanoTime();
- long end;
- do {
- end = System.nanoTime();
- } while (start + nanos >= end);
- } catch (Exception e) {
- MainMod.LOGGER.catching(e);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java
deleted file mode 100644
index c4ff2f721c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.awt.Color;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Objects;
-
-import net.minecraft.item.EnumRarity;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-
-import gregtech.api.interfaces.IColorModulationContainer;
-import gregtech.api.util.GT_LanguageManager;
-
-public class BioCulture extends BioData implements IColorModulationContainer {
-
- public static final ArrayList<BioCulture> BIO_CULTURE_ARRAY_LIST = new ArrayList<>();
- public static final BioCulture NULLCULTURE = BioCulture
- .createAndRegisterBioCulture(Color.BLUE, "", BioPlasmid.NULLPLASMID, BioDNA.NULLDNA, false); // fallback
- // NULL
- // culture,
- // also Blue =)
-
- public String getLocalisedName() {
- return GT_LanguageManager.getTranslation(this.getName());
- }
-
- public void setLocalisedName(String localisedName) {
- GT_LanguageManager.addStringLocalization(this.getName(), localisedName);
- }
-
- Color color;
- BioPlasmid plasmid;
- BioDNA dDNA;
- boolean bBreedable;
- Fluid mFluid;
-
- protected BioCulture(Color color, String name, int ID, BioPlasmid plasmid, BioDNA dDNA, EnumRarity rarity,
- boolean bBreedable) {
- super(name, ID, rarity);
- this.color = color;
- this.plasmid = plasmid;
- this.dDNA = dDNA;
- this.bBreedable = bBreedable;
- }
-
- protected BioCulture(Color color, String name, int ID, BioPlasmid plasmid, BioDNA dDNA) {
- super(name, ID, dDNA.getRarity());
- this.color = color;
- this.plasmid = plasmid;
- this.dDNA = dDNA;
- }
-
- public static BioCulture createAndRegisterBioCulture(Color color, String name, BioPlasmid plasmid, BioDNA dna,
- EnumRarity rarity, boolean breedable) {
- BioCulture ret = new BioCulture(color, name, BIO_CULTURE_ARRAY_LIST.size(), plasmid, dna, rarity, breedable);
- BIO_CULTURE_ARRAY_LIST.add(ret);
- return ret;
- }
-
- public static BioCulture createAndRegisterBioCulture(Color color, String name, BioPlasmid plasmid, BioDNA dna,
- boolean breedable) {
- BioCulture ret = new BioCulture(
- color,
- name,
- BIO_CULTURE_ARRAY_LIST.size(),
- plasmid,
- dna,
- dna.getRarity(),
- breedable);
- BIO_CULTURE_ARRAY_LIST.add(ret);
- return ret;
- }
-
- public static NBTTagCompound getNBTTagFromCulture(BioCulture bioCulture) {
- if (bioCulture == null) return new NBTTagCompound();
- NBTTagCompound ret = new NBTTagCompound();
- ret.setString("Name", bioCulture.name);
- // ret.setInteger("ID", bioCulture.ID);
- ret.setIntArray(
- "Color",
- new int[] { bioCulture.color.getRed(), bioCulture.color.getGreen(), bioCulture.color.getBlue() });
- ret.setTag("Plasmid", BioData.getNBTTagFromBioData(BioData.convertBioPlasmidToBioData(bioCulture.plasmid)));
- ret.setTag("DNA", BioData.getNBTTagFromBioData(BioData.convertBioDNAToBioData(bioCulture.dDNA)));
- ret.setBoolean("Breedable", bioCulture.bBreedable);
- ret.setByte("Rarety", BW_Util.getByteFromRarity(bioCulture.rarity));
- if (bioCulture.bBreedable) ret.setString(
- "Fluid",
- bioCulture.getFluid()
- .getName());
- return ret;
- }
-
- public static BioCulture getBioCultureFromNBTTag(NBTTagCompound tag) {
- if (tag == null || tag.getIntArray("Color").length == 0) return null;
- BioCulture ret = getBioCulture(tag.getString("Name"));
-
- if (ret == null) ret = createAndRegisterBioCulture(
- new Color(tag.getIntArray("Color")[0], tag.getIntArray("Color")[1], tag.getIntArray("Color")[2]),
- tag.getString("Name"),
- BioPlasmid.convertDataToPlasmid(getBioDataFromNBTTag(tag.getCompoundTag("Plasmid"))),
- BioDNA.convertDataToDNA(getBioDataFromNBTTag(tag.getCompoundTag("DNA"))),
- BW_Util.getRarityFromByte(tag.getByte("Rarety")),
- tag.getBoolean("Breedable"));
- if (ret.bBreedable) ret.setFluid(FluidRegistry.getFluid(tag.getString("Fluid")));
- if (ret.getFluidNotSet()) // should never happen, but better safe than sorry
- ret.setbBreedable(false);
- return ret;
- }
-
- public static BioCulture getBioCulture(String Name) {
- if (Name == null || Name.isEmpty()) return null;
- for (BioCulture b : BIO_CULTURE_ARRAY_LIST) if (b.name.equals(Name)) return b;
- return null;
- }
-
- public static BioCulture getBioCulture(BioDNA DNA) {
- for (BioCulture b : BIO_CULTURE_ARRAY_LIST) if (b.getdDNA()
- .equals(DNA)) return b;
- return null;
- }
-
- public Fluid getFluid() {
- if (this.mFluid == null)
- throw new IllegalStateException("Fluid has not been set yet! The issuring Culture is: " + this.name);
- return this.mFluid;
- }
-
- public void setFluid(Fluid mFluid) {
- this.mFluid = mFluid;
- }
-
- public boolean getFluidNotSet() {
- return this.mFluid == null && this.isBreedable();
- }
-
- public boolean isBreedable() {
- return this.bBreedable;
- }
-
- public void setbBreedable(boolean bBreedable) {
- this.bBreedable = bBreedable;
- }
-
- public int getColorRGB() {
- return BW_ColorUtil
- .getColorFromRGBArray(new int[] { this.color.getRed(), this.color.getGreen(), this.color.getBlue() });
- }
-
- public Color getColor() {
- return this.color;
- }
-
- public void setColor(Color color) {
- this.color = color;
- }
-
- public BioPlasmid getPlasmid() {
- return this.plasmid;
- }
-
- public BioCulture setPlasmid(BioPlasmid plasmid) {
- return this.checkForExisting(
- new BioCulture(this.color, this.name, this.ID, plasmid, this.dDNA, this.rarity, this.bBreedable));
- }
-
- private BioCulture checkForExisting(BioCulture culture) {
- if (culture == null) return null;
- for (BioCulture bc : BioCulture.BIO_CULTURE_ARRAY_LIST) if (culture.getdDNA()
- .equals(bc.getdDNA())
- && culture.getPlasmid()
- .equals(bc.getPlasmid()))
- return bc;
- return culture;
- }
-
- public BioCulture setPlasmidUnsafe(BioPlasmid plasmid) {
- this.plasmid = plasmid;
- return this;
- }
-
- public BioDNA getdDNA() {
- return this.dDNA;
- }
-
- public BioCulture setdDNA(BioDNA dDNA) {
- return this.checkForExisting(
- new BioCulture(this.color, this.name, this.ID, this.plasmid, dDNA, this.rarity, this.bBreedable));
- }
-
- public BioCulture setdDNAUnsafe(BioDNA dDNA) {
- this.dDNA = dDNA;
- return this;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass() || !super.equals(o)) return false;
- BioCulture culture = (BioCulture) o;
- return this.isBreedable() == culture.isBreedable() && Objects.equals(this.getColor(), culture.getColor())
- && Objects.equals(this.getPlasmid(), culture.getPlasmid())
- && Objects.equals(this.getdDNA(), culture.getdDNA())
- && Objects.equals(this.mFluid, culture.mFluid);
- }
-
- @Override
- public int hashCode() {
- return MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(17)
- .putInt(
- MurmurHash3.murmurhash3_x86_32(
- this.getName(),
- 0,
- this.getName()
- .length(),
- 31))
- .putInt(this.getColorRGB())
- .putInt(this.getPlasmid().ID)
- .putInt(this.getdDNA().ID)
- .put((byte) (this.isBreedable() ? 1 : 0))
- .array(),
- 0,
- 17,
- 31);
- }
-
- @Override
- public short[] getRGBA() {
- return new short[] { (short) this.getColor()
- .getRed(),
- (short) this.getColor()
- .getGreen(),
- (short) this.getColor()
- .getBlue(),
- (short) this.getColor()
- .getAlpha() };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java
deleted file mode 100644
index 22edd60170..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import net.minecraft.item.EnumRarity;
-
-public class BioDNA extends BioData {
-
- public static final BioDNA NULLDNA = createAndRegisterBioDNA("", EnumRarity.epic);
-
- protected BioDNA(String name, int ID, EnumRarity rarity) {
- super(name, ID, rarity);
- }
-
- protected BioDNA(BioData bioData) {
- super(bioData);
- this.name = bioData.name;
- this.ID = bioData.ID;
- this.rarity = bioData.rarity;
- }
-
- public static BioDNA convertDataToDNA(BioData bioData) {
- return new BioDNA(bioData);
- }
-
- public static BioDNA createAndRegisterBioDNA(String aName, EnumRarity rarity) {
- BioData ret = BioData.createAndRegisterBioData(aName, rarity);
- return new BioDNA(ret);
- }
-
- public static BioDNA createAndRegisterBioDNA(String aName, EnumRarity rarity, int chance, int tier) {
- BioData ret = BioData.createAndRegisterBioData(aName, rarity, chance, tier);
- return new BioDNA(ret);
- }
-
- @Override
- public String toString() {
- return "BioDNA{" + "name='" + this.name + '\'' + ", ID=" + this.ID + '}';
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java
deleted file mode 100644
index 7a4c87f7d2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Objects;
-
-import net.minecraft.item.EnumRarity;
-import net.minecraft.nbt.NBTTagCompound;
-
-public class BioData {
-
- public static final ArrayList<BioData> BIO_DATA_ARRAY_LIST = new ArrayList<>();
-
- protected String name;
- protected int ID;
- protected EnumRarity rarity;
- protected int chance;
- protected int tier;
-
- protected BioData(String name, int ID, EnumRarity rarity, int chance, int tier) {
- this.name = name;
- this.ID = ID;
- this.rarity = rarity;
- this.chance = chance;
- this.tier = tier;
- }
-
- protected BioData(String name, int ID, EnumRarity rarity) {
- this.name = name;
- this.ID = ID;
- this.rarity = rarity;
- this.chance = 7500;
- this.tier = 0;
- }
-
- protected BioData(BioData bioData) {
- this.rarity = bioData.rarity;
- this.name = bioData.name;
- this.ID = bioData.ID;
- this.chance = bioData.chance;
- this.tier = bioData.tier;
- }
-
- public static BioData convertBioPlasmidToBioData(BioPlasmid bioPlasmid) {
- return new BioData(bioPlasmid.name, bioPlasmid.ID, bioPlasmid.rarity, bioPlasmid.chance, bioPlasmid.tier);
- }
-
- public static BioData convertBioDNAToBioData(BioDNA bioDNA) {
- return new BioData(bioDNA.name, bioDNA.ID, bioDNA.rarity, bioDNA.chance, bioDNA.tier);
- }
-
- public static BioData createAndRegisterBioData(String aName, EnumRarity rarity, int chance, int tier) {
- BioData ret = new BioData(aName, BIO_DATA_ARRAY_LIST.size(), rarity, chance, tier);
- BIO_DATA_ARRAY_LIST.add(ret);
- return ret;
- }
-
- public static BioData createAndRegisterBioData(String aName, EnumRarity rarity) {
- BioData ret = new BioData(aName, BIO_DATA_ARRAY_LIST.size(), rarity);
- BIO_DATA_ARRAY_LIST.add(ret);
- return ret;
- }
-
- public static NBTTagCompound getNBTTagFromBioData(BioData bioData) {
- NBTTagCompound ret = new NBTTagCompound();
- ret.setByte("Rarity", BW_Util.getByteFromRarity(bioData.rarity));
- ret.setString("Name", bioData.name);
- // ret.setInteger("ID", bioData.ID); buggy when load Order changes
- ret.setInteger("Chance", bioData.chance);
- ret.setInteger("Tier", bioData.tier);
- return ret;
- }
-
- public static BioData getBioDataFromNBTTag(NBTTagCompound tag) {
- if (tag == null) return null;
- return getBioDataFromName(tag.getString("Name"));
- }
-
- public static BioData getBioDataFromName(String Name) {
- for (BioData bd : BIO_DATA_ARRAY_LIST) if (bd.name.equals(Name)) return bd;
- return null;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass()) return false;
- BioData bioData = (BioData) o;
- return this.getID() == bioData.getID()
- || this.getChance() == bioData.getChance() && this.getTier() == bioData.getTier()
- && Objects.equals(this.getName(), bioData.getName())
- && this.getRarity() == bioData.getRarity();
- }
-
- @Override
- public int hashCode() {
- return MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(13)
- .putInt(
- MurmurHash3.murmurhash3_x86_32(
- this.getName(),
- 0,
- this.getName()
- .length(),
- 31))
- .put(BW_Util.getByteFromRarity(this.getRarity()))
- .putInt(this.getChance())
- .putInt(this.getTier())
- .array(),
- 0,
- 13,
- 31);
- }
-
- public int getTier() {
- return this.tier;
- }
-
- public void setTier(int tier) {
- this.tier = tier;
- }
-
- @Override
- public String toString() {
- return "BioData{" + "name='" + this.name + '\'' + ", ID=" + this.ID + '}';
- }
-
- public EnumRarity getRarity() {
- return this.rarity;
- }
-
- public void setRarity(EnumRarity rarity) {
- this.rarity = rarity;
- }
-
- public int getChance() {
- return this.chance;
- }
-
- public void setChance(int chance) {
- this.chance = chance;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * DO NOT USE GET ID TO GET THE OBJECT! THIS SHOULD ONLY BE USED FOR COMPARISON!
- *
- * @return the position in the loading list
- */
- public int getID() {
- return this.ID;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java
deleted file mode 100644
index 0d40d9deca..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import net.minecraft.item.EnumRarity;
-
-public class BioPlasmid extends BioData {
-
- public static final BioPlasmid NULLPLASMID = convertDataToPlasmid(BioData.convertBioDNAToBioData(BioDNA.NULLDNA));
-
- private BioPlasmid(String name, int ID, EnumRarity rarity) {
- super(name, ID, rarity);
- }
-
- protected BioPlasmid(BioData bioData) {
- super(bioData);
- this.name = bioData.name;
- this.ID = bioData.ID;
- this.rarity = bioData.rarity;
- }
-
- public static BioPlasmid convertDataToPlasmid(BioData bioData) {
- return new BioPlasmid(bioData);
- }
-
- public static BioPlasmid createAndRegisterBioPlasmid(String aName, EnumRarity rarity) {
- BioData ret = BioData.createAndRegisterBioData(aName, rarity);
- return new BioPlasmid(ret);
- }
-
- public static BioPlasmid createAndRegisterBioPlasmid(String aName, EnumRarity rarity, int chance, int tier) {
- BioData ret = BioData.createAndRegisterBioData(aName, rarity, chance, tier);
- return new BioPlasmid(ret);
- }
-
- @Override
- public String toString() {
- return "BioPlasmid{" + "name='" + this.name + '\'' + ", ID=" + this.ID + '}';
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java
deleted file mode 100644
index 063a310db8..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-public class CachedReflectionUtils {
-
- private static final ClassValue<Map<String, Field>> fields = new ConcurrentMapClassValue();
- private static final ClassValue<Map<String, Field>> declaredFields = new ConcurrentMapClassValue();
-
- public static Field getField(final Class<?> cls, final String fieldName) {
- return fields.get(cls)
- .computeIfAbsent(fieldName, f -> FieldUtils.getField(cls, f, true));
- }
-
- public static Field getDeclaredField(final Class<?> cls, final String fieldName) {
- return declaredFields.get(cls)
- .computeIfAbsent(fieldName, f -> FieldUtils.getDeclaredField(cls, f, true));
- }
-
- private static class ConcurrentMapClassValue extends ClassValue<Map<String, Field>> {
-
- @Override
- protected Map<String, Field> computeValue(Class<?> type) {
- return new ConcurrentHashMap<>();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java
deleted file mode 100644
index f1d6eeedb3..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-public class ChatColorHelper {
-
- private ChatColorHelper() {}
-
- public static final String BLACK = (char) 167 + "0";
- public static final String DARKBLUE = (char) 167 + "1";
- public static final String DARKGREEN = (char) 167 + "2";
- public static final String DARKAQUA = (char) 167 + "3";
- public static final String DARKRED = (char) 167 + "4";
- public static final String DARKPURPLE = (char) 167 + "5";
- public static final String GOLD = (char) 167 + "6";
- public static final String GRAY = (char) 167 + "7";
- public static final String DARKGRAY = (char) 167 + "8";
- public static final String BLUE = (char) 167 + "9";
- public static final String GREEN = (char) 167 + "a";
- public static final String AQUA = (char) 167 + "b";
- public static final String RED = (char) 167 + "c";
- public static final String LIGHT_PURPLE = (char) 167 + "d";
- public static final String YELLOW = (char) 167 + "e";
- public static final String WHITE = (char) 167 + "f";
- public static final String OBFUSCATED = (char) 167 + "k";
- public static final String BOLD = (char) 167 + "l";
- public static final String STRIKETHROUGH = (char) 167 + "m";
- public static final String UNDERLINE = (char) 167 + "n";
- public static final String ITALIC = (char) 167 + "o";
- public static final String RESET = (char) 167 + "r";
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java
deleted file mode 100644
index 9feb344fa0..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.HashSet;
-
-import net.minecraft.block.Block;
-import net.minecraft.world.World;
-import net.minecraftforge.common.DimensionManager;
-
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-
-public class ConnectedBlocksChecker {
-
- public final HashSet<Coords> hashset = new HashSet<>(2048);
-
- public static byte check_sourroundings(Coords C, Block b) {
- byte ret = 0;
- World w = DimensionManager.getWorld(C.wID);
- int x = C.x, y = C.y, z = C.z;
-
- if (w.getBlock(x + 1, y, z)
- .equals(b)) ret = (byte) (ret | 0b000100);
-
- if (w.getBlock(x - 1, y, z)
- .equals(b)) ret = (byte) (ret | 0b001000);
-
- if (w.getBlock(x, y, z + 1)
- .equals(b)) ret = (byte) (ret | 0b010000);
-
- if (w.getBlock(x, y, z - 1)
- .equals(b)) ret = (byte) (ret | 0b100000);
-
- if (w.getBlock(x, y + 1, z)
- .equals(b)) ret = (byte) (ret | 0b000001);
-
- if (w.getBlock(x, y - 1, z)
- .equals(b)) ret = (byte) (ret | 0b000010);
-
- return ret;
- }
-
- public int get_connected(World w, int x, int y, int z, Block b) {
- int ret = 0;
-
- int wID = w.provider.dimensionId;
-
- byte sides = this.check_sourroundings(w, x, y, z, b);
-
- if ((sides | 0b111011) == 0b111111 && !this.hashset.contains(new Coords(x + 1, y, z, wID))) {
- ret++;
- ret += this.get_connected(w, x + 1, y, z, b);
- }
-
- if ((sides | 0b110111) == 0b111111 && !this.hashset.contains(new Coords(x - 1, y, z, wID))) {
- ret++;
- ret += this.get_connected(w, x - 1, y, z, b);
- }
-
- if ((sides | 0b101111) == 0b111111 && !this.hashset.contains(new Coords(x, y, z + 1, wID))) {
- ret++;
- ret += this.get_connected(w, x, y, z + 1, b);
- }
-
- if ((sides | 0b011111) == 0b111111 && !this.hashset.contains(new Coords(x, y, z - 1, wID))) {
- ret++;
- ret += this.get_connected(w, x, y, z - 1, b);
- }
-
- if ((sides | 0b111110) == 0b111111 && !this.hashset.contains(new Coords(x, y + 1, z, wID))) {
- ret++;
- ret += this.get_connected(w, x, y + 1, z, b);
- }
-
- if ((sides | 0b111101) == 0b111111 && !this.hashset.contains(new Coords(x, y - 1, z, wID))) {
- ret++;
- ret += this.get_connected(w, x, y - 1, z, b);
- }
-
- return ret;
- }
-
- public byte check_sourroundings(World w, int x, int y, int z, Block b) {
-
- byte ret = 0;
- int wID = w.provider.dimensionId;
-
- if (this.hashset.contains(new Coords(x, y, z, wID))) return ret;
-
- this.hashset.add(new Coords(x, y, z, wID));
-
- if (w.getBlock(x + 1, y, z)
- .equals(b)) ret = (byte) (ret | 0b000100);
-
- if (w.getBlock(x - 1, y, z)
- .equals(b)) ret = (byte) (ret | 0b001000);
-
- if (w.getBlock(x, y, z + 1)
- .equals(b)) ret = (byte) (ret | 0b010000);
-
- if (w.getBlock(x, y, z - 1)
- .equals(b)) ret = (byte) (ret | 0b100000);
-
- if (w.getBlock(x, y + 1, z)
- .equals(b)) ret = (byte) (ret | 0b000001);
-
- if (w.getBlock(x, y - 1, z)
- .equals(b)) ret = (byte) (ret | 0b000010);
-
- return ret;
- }
-
- public boolean get_meta_of_sideblocks(World w, int n, int[] xyz, boolean GT) {
-
- int wID = w.provider.dimensionId;
- Coords Controller = new Coords(xyz[0], xyz[1], xyz[2], wID);
-
- for (Coords C : this.hashset) {
- if (GT) {
- if (!new Coords(C.x, C.y + 1, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y + 1, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x, C.y - 1, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y - 1, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x + 1, C.y, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x + 1, C.y, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x - 1, C.y, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x - 1, C.y, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x, C.y, C.z + 1, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y, C.z + 1) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x, C.y, C.z - 1, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y, C.z - 1) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- } else {
- if (n == w.getBlockMetadata(C.x, C.y + 1, C.z) && !new Coords(C.x, C.y + 1, C.z, wID).equals(Controller)
- || n == w.getBlockMetadata(C.x, C.y - 1, C.z)
- && !new Coords(C.x, C.y - 1, C.z, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x + 1, C.y, C.z)
- && !new Coords(C.x + 1, C.y, C.z, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x - 1, C.y, C.z)
- && !new Coords(C.x - 1, C.y, C.z, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x, C.y, C.z + 1)
- && !new Coords(C.x, C.y, C.z + 1, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x, C.y, C.z - 1)
- && !new Coords(C.x, C.y, C.z - 1, wID).equals(Controller)) {
- return true;
- }
- }
- }
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java
deleted file mode 100644
index cfd2c70d1d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Queue;
-
-import net.minecraft.block.Block;
-import net.minecraft.world.World;
-
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-
-/**
- * This implementation is for some reason slower than the Recursive Check.... For ~3400 blocks this takes 8ms, the
- * Recursive Check 5ms.
- */
-public class ConnectedBlocksCheckerIteration {
-
- public final HashSet<Coords> hashset = new HashSet<>(2048);
- public final HashSet<Coords> checked = new HashSet<>(4096);
- private final Queue<Coords> kwoe = new LinkedList<>();
-
- public long get_connected(World w, int x, int y, int z, Block b) {
- this.kwoe.add(new Coords(x, y, z, w.provider.dimensionId));
- this.hashset.add(new Coords(x, y, z, w.provider.dimensionId));
- while (!this.kwoe.isEmpty()) {
- Coords tocheck = this.kwoe.poll();
- int wID = w.provider.dimensionId;
- this.checked.add(tocheck);
- Coords c;
- if (!this.checked.contains(c = new Coords(tocheck.x + 1, tocheck.y, tocheck.z, wID))
- && w.getBlock(tocheck.x + 1, tocheck.y, tocheck.z)
- .equals(b)) {
- this.kwoe.add(c);
- this.hashset.add(c);
- }
- if (!this.checked.contains(c = new Coords(tocheck.x - 1, tocheck.y, tocheck.z, wID))
- && w.getBlock(tocheck.x - 1, tocheck.y, tocheck.z)
- .equals(b)) {
- this.kwoe.add(c);
- this.hashset.add(c);
- }
- if (!this.checked.contains(c = new Coords(tocheck.x, tocheck.y, tocheck.z + 1, wID))
- && w.getBlock(tocheck.x, tocheck.y, tocheck.z + 1)
- .equals(b)) {
- this.kwoe.add(c);
- this.hashset.add(c);
- }
- if (!this.checked.contains(c = new Coords(tocheck.x, tocheck.y, tocheck.z - 1, wID))
- && w.getBlock(tocheck.x, tocheck.y, tocheck.z - 1)
- .equals(b)) {
- this.kwoe.add(c);
- this.hashset.add(c);
- }
- if (!this.checked.contains(c = new Coords(tocheck.x, tocheck.y + 1, tocheck.z, wID))
- && w.getBlock(tocheck.x, tocheck.y + 1, tocheck.z)
- .equals(b)) {
- this.kwoe.add(c);
- this.hashset.add(c);
- }
- if (!this.checked.contains(c = new Coords(tocheck.x, tocheck.y - 1, tocheck.z, wID))
- && w.getBlock(tocheck.x, tocheck.y - 1, tocheck.z)
- .equals(b)) {
- this.kwoe.add(c);
- this.hashset.add(c);
- }
- }
- return this.hashset.size();
- }
-
- public boolean get_meta_of_sideblocks(World w, int n, int[] xyz, boolean GT) {
-
- int wID = w.provider.dimensionId;
- Coords Controller = new Coords(xyz[0], xyz[1], xyz[2], wID);
-
- for (Coords C : this.hashset) {
- if (GT) {
- if (!new Coords(C.x, C.y + 1, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y + 1, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x, C.y - 1, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y - 1, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x + 1, C.y, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x + 1, C.y, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x - 1, C.y, C.z, wID).equals(Controller)
- && w.getTileEntity(C.x - 1, C.y, C.z) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x, C.y, C.z + 1, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y, C.z + 1) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- if (!new Coords(C.x, C.y, C.z - 1, wID).equals(Controller)
- && w.getTileEntity(C.x, C.y, C.z - 1) instanceof IGregTechTileEntity gtTE
- && gtTE.getMetaTileID() == n) {
- return true;
- }
- } else {
- if (n == w.getBlockMetadata(C.x, C.y + 1, C.z) && !new Coords(C.x, C.y + 1, C.z, wID).equals(Controller)
- || n == w.getBlockMetadata(C.x, C.y - 1, C.z)
- && !new Coords(C.x, C.y - 1, C.z, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x + 1, C.y, C.z)
- && !new Coords(C.x + 1, C.y, C.z, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x - 1, C.y, C.z)
- && !new Coords(C.x - 1, C.y, C.z, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x, C.y, C.z + 1)
- && !new Coords(C.x, C.y, C.z + 1, wID).equals(Controller)) {
- return true;
- }
- if (n == w.getBlockMetadata(C.x, C.y, C.z - 1)
- && !new Coords(C.x, C.y, C.z - 1, wID).equals(Controller)) {
- return true;
- }
- }
- }
- return false;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java
deleted file mode 100644
index f8c33dd8e9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import net.minecraftforge.common.util.ForgeDirection;
-
-public class Coords {
-
- public int x, z, wID;
- public short y;
-
- public Coords(int x, int y, int z, int wID) {
- this(x, y, z);
- this.wID = wID;
- }
-
- public Coords(int x, int y, int z) {
- this.x = x;
- this.y = (short) y;
- this.z = z;
- this.wID = 0;
- }
-
- public Coords getCoordsFromSide(ForgeDirection direction) {
- return switch (direction) {
- case UP -> new Coords(this.x, this.y + 1, this.z, this.wID);
- case DOWN -> new Coords(this.x, this.y - 1, this.z, this.wID);
- case WEST -> new Coords(this.x - 1, this.y, this.z, this.wID);
- case EAST -> new Coords(this.x + 1, this.y, this.z, this.wID);
- case NORTH -> new Coords(this.x, this.y, this.z - 1, this.wID);
- case SOUTH -> new Coords(this.x, this.y, this.z + 1, this.wID);
- default -> throw new UnsupportedOperationException("This is impossible.");
- };
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass()) return false;
- Coords coords = (Coords) o;
- return this.x == coords.x && this.y == coords.y && this.z == coords.z && this.wID == coords.wID;
- }
-
- @Override
- public int hashCode() {
- byte[] data = new byte[14];
- data[0] = (byte) (this.x & 0xff);
- data[1] = (byte) (this.x >> 4 & 0xff);
- data[2] = (byte) (this.x >> 8 & 0xff);
- data[3] = (byte) (this.x >> 12 & 0xff);
- data[4] = (byte) (this.y & 0xff);
- data[5] = (byte) (this.y >> 4 & 0xff);
- data[6] = (byte) (this.z & 0xff);
- data[7] = (byte) (this.z >> 4 & 0xff);
- data[8] = (byte) (this.z >> 8 & 0xff);
- data[9] = (byte) (this.z >> 12 & 0xff);
- data[10] = (byte) (this.wID & 0xff);
- data[11] = (byte) (this.wID >> 4 & 0xff);
- data[12] = (byte) (this.wID >> 8 & 0xff);
- data[13] = (byte) (this.wID >> 12 & 0xff);
- return MurmurHash3.murmurhash3_x86_32(data, 0, 14, 31);
- }
-
- @Override
- public String toString() {
- return this.x + "," + this.y + "," + this.z + "," + this.wID;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java
deleted file mode 100644
index 678f8facba..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import net.minecraftforge.common.util.EnumHelper;
-
-import gregtech.api.enums.Element;
-import gregtech.api.enums.OrePrefixes;
-
-public class EnumUtils {
-
- private EnumUtils() {}
-
- public static OrePrefixes addNewOrePrefix(String enumName, 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) {
- return EnumHelper.addEnum(
- OrePrefixes.class,
- enumName,
- new Class<?>[] { String.class, String.class, String.class, boolean.class, boolean.class, boolean.class,
- boolean.class, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class,
- int.class, long.class, int.class, int.class },
- new Object[] { aRegularLocalName, aLocalizedMaterialPre, aLocalizedMaterialPost, aIsUnificatable,
- aIsMaterialBased, aIsSelfReferencing, aIsContainer, aDontUnificateActively, aIsUsedForBlocks,
- aAllowNormalRecycling, aGenerateDefaultItem, aIsEnchantable, aIsUsedForOreProcessing,
- aMaterialGenerationBits, aMaterialAmount, aDefaultStackSize, aTextureindex });
- }
-
- public static Element createNewElement(String enumName, long aProtons, long aNeutrons, long aAdditionalMass,
- long aHalfLifeSeconds, String aDecayTo, String aName, boolean aIsIsotope) {
- return EnumHelper.addEnum(
- Element.class,
- enumName,
- new Class[] { long.class, long.class, long.class, long.class, String.class, String.class, boolean.class },
- new Object[] { aProtons, aNeutrons, aAdditionalMass, aHalfLifeSeconds, aDecayTo, aName, aIsIsotope });
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java
deleted file mode 100644
index e8f4330ed3..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-/*
- * Faster implementations for Math stuff
- */
-@SuppressWarnings("unused")
-public class MathUtils {
-
- public static long floorLong(double x) {
- if (Double.isInfinite(x) || Double.isNaN(x)) return (long) x;
- long xi = (long) x;
- return x < xi ? xi - 1 : xi;
- }
-
- public static long ceilLong(double x) {
- if (Double.isInfinite(x) || Double.isNaN(x)) return (long) x;
- long xi = (long) x;
- return x > xi ? xi + 1 : xi;
- }
-
- public static int floorInt(double x) {
- if (Double.isInfinite(x) || Double.isNaN(x)) return (int) x;
- int xi = (int) x;
- return x < xi ? xi - 1 : xi;
- }
-
- public static int ceilInt(float x) {
- if (Float.isInfinite(x) || Float.isNaN(x)) return (int) x;
- int xi = (int) x;
- return x > xi ? xi + 1 : xi;
- }
-
- public static int ceilInt(double x) {
- if (Double.isInfinite(x) || Double.isNaN(x)) return (int) x;
- int xi = (int) x;
- return x > xi ? xi + 1 : xi;
- }
-
- public static double floor(double x) {
- if (Double.isInfinite(x) || Double.isNaN(x)) return x;
- int xi = (int) x;
- return x < xi ? xi - 1 : xi;
- }
-
- public static double ceil(double x) {
- if (Double.isInfinite(x) || Double.isNaN(x)) return x;
- int xi = (int) x;
- return x > xi ? xi + 1 : xi;
- }
-
- public static byte clamp(byte amount, byte min, byte max) {
- byte inner = amount <= max ? amount : max;
- return min >= inner ? min : inner;
- }
-
- public static short clamp(short amount, short min, short max) {
- short inner = amount <= max ? amount : max;
- return min >= inner ? min : inner;
- }
-
- public static int clamp(int amount, int min, int max) {
- return Math.max(min, Math.min(amount, max));
- }
-
- public static long clamp(long amount, long min, long max) {
- return Math.max(min, Math.min(amount, max));
- }
-
- public static float clamp(float amount, float min, float max) {
- return Math.max(min, Math.min(amount, max));
- }
-
- public static double clamp(double amount, double min, double max) {
- return Math.max(min, Math.min(amount, max));
- }
-
- public static <T extends Comparable<T>> T clamp(T val, T min, T max) {
- return val.compareTo(min) < 0 ? min : val.compareTo(max) > 0 ? max : val;
- }
-
- public static int wrap(int input, int bound) {
- return (input % bound + bound) % bound;
- }
-
- public static long wrap(long input, long bound) {
- return (input % bound + bound) % bound;
- }
-
- public static double wrap(double input, double bound) {
- return (input % bound + bound) % bound;
- }
-
- public static float wrap(float input, float bound) {
- return (input % bound + bound) % bound;
- }
-
- public static float tanh(float x) {
- float x2 = x * x;
- float a = x * (135135.0f + x2 * (17325.0f + x2 * (378.0f + x2)));
- float b = 135135.0f + x2 * (62370.0f + x2 * (3150.0f + x2 * 28.0f));
- return clamp(a / b, -1, 1);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java
deleted file mode 100644
index 501b473d98..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * The MurmurHash3 algorithm was created by Austin Appleby and placed in the public domain. This java port was authored
- * by Yonik Seeley and also placed into the public domain. The author hereby disclaims copyright to this source code.
- * <p> This produces exactly the same hash values as the final C++ version of MurmurHash3 and is thus suitable for
- * producing the same hash values across platforms. <p> The 32 bit x86 version of this hash should be the fastest
- * variant for relatively short keys like ids. murmurhash3_x64_128 is a good choice for longer strings or if you need
- * more than 32 bits of hash. <p> Note - The x86 and x64 versions do _not_ produce the same results, as the algorithms
- * are optimized for their respective platforms. <p> See http://github.com/yonik/java_util for future updates to this
- * file. Special Thanks to Austin Appleby and Yonik Seeley for placing this in the public domain and therefore allowing
- * me to use it!
- */
-package com.github.bartimaeusnek.bartworks.util;
-
-public final class MurmurHash3 {
-
- public static int fmix32(int h) {
- h ^= h >>> 16;
- h *= 0x85ebca6b;
- h ^= h >>> 13;
- h *= 0xc2b2ae35;
- h ^= h >>> 16;
- return h;
- }
-
- public static long fmix64(long k) {
- k ^= k >>> 33;
- k *= 0xff51afd7ed558ccdL;
- k ^= k >>> 33;
- k *= 0xc4ceb9fe1a85ec53L;
- k ^= k >>> 33;
- return k;
- }
-
- /**
- * Gets a long from a byte buffer in little endian byte order.
- */
- public static long getLongLittleEndian(byte[] buf, int offset) {
- return (long) buf[offset + 7] << 56 // no mask needed
- | (buf[offset + 6] & 0xffL) << 48
- | (buf[offset + 5] & 0xffL) << 40
- | (buf[offset + 4] & 0xffL) << 32
- | (buf[offset + 3] & 0xffL) << 24
- | (buf[offset + 2] & 0xffL) << 16
- | (buf[offset + 1] & 0xffL) << 8
- | buf[offset] & 0xffL; // no shift needed
- }
-
- /**
- * Returns the MurmurHash3_x86_32 hash.
- */
- public static int murmurhash3_x86_32(byte[] data, int offset, int len, int seed) {
-
- final int c1 = 0xcc9e2d51;
- final int c2 = 0x1b873593;
-
- int h1 = seed;
- int roundedEnd = offset + (len & 0xfffffffc); // round down to 4 byte block
-
- for (int i = offset; i < roundedEnd; i += 4) {
- // little endian load order
- int k1 = data[i] & 0xff | (data[i + 1] & 0xff) << 8 | (data[i + 2] & 0xff) << 16 | data[i + 3] << 24;
- k1 *= c1;
- k1 = k1 << 15 | k1 >>> 17; // ROTL32(k1,15);
- k1 *= c2;
-
- h1 ^= k1;
- h1 = h1 << 13 | h1 >>> 19; // ROTL32(h1,13);
- h1 = h1 * 5 + 0xe6546b64;
- }
-
- // tail
- int k1 = 0;
-
- switch (len & 0x03) {
- case 3:
- k1 = (data[roundedEnd + 2] & 0xff) << 16;
- // fallthrough
- case 2:
- k1 |= (data[roundedEnd + 1] & 0xff) << 8;
- // fallthrough
- case 1:
- k1 |= data[roundedEnd] & 0xff;
- k1 *= c1;
- k1 = k1 << 15 | k1 >>> 17; // ROTL32(k1,15);
- k1 *= c2;
- h1 ^= k1;
- }
-
- // finalization
- h1 ^= len;
-
- // fmix(h1);
- h1 ^= h1 >>> 16;
- h1 *= 0x85ebca6b;
- h1 ^= h1 >>> 13;
- h1 *= 0xc2b2ae35;
- h1 ^= h1 >>> 16;
-
- return h1;
- }
-
- /**
- * Returns the MurmurHash3_x86_32 hash of the UTF-8 bytes of the String without actually encoding the string to a
- * temporary buffer. This is more than 2x faster than hashing the result of String.getBytes().
- */
- public static int murmurhash3_x86_32(CharSequence data, int offset, int len, int seed) {
-
- final int c1 = 0xcc9e2d51;
- final int c2 = 0x1b873593;
-
- int h1 = seed;
-
- int pos = offset;
- int end = offset + len;
- int k1 = 0;
- int k2 = 0;
- int shift = 0;
- int bits = 0;
- int nBytes = 0; // length in UTF8 bytes
-
- while (pos < end) {
- int code = data.charAt(pos);
- pos++;
- if (code < 0x80) {
- k2 = code;
- bits = 8;
-
- /***
- * // optimized ascii implementation (currently slower!!! code size?) if (shift == 24) { k1 = k1 | (code
- * << 24);
- *
- * k1 *= c1; k1 = (k1 << 15) | (k1 >>> 17); // ROTL32(k1,15); k1 *= c2;
- *
- * h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); // ROTL32(h1,13); h1 = h1*5+0xe6546b64;
- *
- * shift = 0; nBytes += 4; k1 = 0; } else { k1 |= code << shift; shift += 8; } continue;
- ***/
- } else if (code < 0x800) {
- k2 = 0xC0 | code >> 6 | (0x80 | code & 0x3F) << 8;
- bits = 16;
- } else if (code < 0xD800 || code > 0xDFFF || pos >= end) {
- // we check for pos>=end to encode an unpaired surrogate as 3 bytes.
- k2 = 0xE0 | code >> 12 | (0x80 | code >> 6 & 0x3F) << 8 | (0x80 | code & 0x3F) << 16;
- bits = 24;
- } else {
- // surrogate pair
- // int utf32 = pos < end ? (int) data.charAt(pos++) : 0;
- int utf32 = data.charAt(pos++);
- utf32 = (code - 0xD7C0 << 10) + (utf32 & 0x3FF);
- k2 = 0xff & (0xF0 | utf32 >> 18) | (0x80 | utf32 >> 12 & 0x3F) << 8
- | (0x80 | utf32 >> 6 & 0x3F) << 16
- | (0x80 | utf32 & 0x3F) << 24;
- bits = 32;
- }
-
- k1 |= k2 << shift;
-
- // int used_bits = 32 - shift; // how many bits of k2 were used in k1.
- // int unused_bits = bits - used_bits; // (bits-(32-shift)) == bits+shift-32 == bits-newshift
-
- shift += bits;
- if (shift >= 32) {
- // mix after we have a complete word
-
- k1 *= c1;
- k1 = k1 << 15 | k1 >>> 17; // ROTL32(k1,15);
- k1 *= c2;
-
- h1 ^= k1;
- h1 = h1 << 13 | h1 >>> 19; // ROTL32(h1,13);
- h1 = h1 * 5 + 0xe6546b64;
-
- shift -= 32;
- // unfortunately, java won't let you shift 32 bits off, so we need to check for 0
- if (shift != 0) {
- k1 = k2 >>> bits - shift; // bits used == bits - newshift
- } else {
- k1 = 0;
- }
- nBytes += 4;
- }
- } // inner
-
- // handle tail
- if (shift > 0) {
- nBytes += shift >> 3;
- k1 *= c1;
- k1 = k1 << 15 | k1 >>> 17; // ROTL32(k1,15);
- k1 *= c2;
- h1 ^= k1;
- }
-
- // finalization
- h1 ^= nBytes;
-
- // fmix(h1);
- h1 ^= h1 >>> 16;
- h1 *= 0x85ebca6b;
- h1 ^= h1 >>> 13;
- h1 *= 0xc2b2ae35;
- h1 ^= h1 >>> 16;
-
- return h1;
- }
-
- /**
- * Returns the MurmurHash3_x64_128 hash, placing the result in "out".
- */
- public static void murmurhash3_x64_128(byte[] key, int offset, int len, int seed, LongPair out) {
- // The original algorithm does have a 32 bit unsigned seed.
- // We have to mask to match the behavior of the unsigned types and prevent sign extension.
- long h1 = seed & 0x00000000FFFFFFFFL;
- long h2 = seed & 0x00000000FFFFFFFFL;
-
- final long c1 = 0x87c37b91114253d5L;
- final long c2 = 0x4cf5ad432745937fL;
-
- int roundedEnd = offset + (len & 0xFFFFFFF0); // round down to 16 byte block
- for (int i = offset; i < roundedEnd; i += 16) {
- long k1 = getLongLittleEndian(key, i);
- long k2 = getLongLittleEndian(key, i + 8);
- k1 *= c1;
- k1 = Long.rotateLeft(k1, 31);
- k1 *= c2;
- h1 ^= k1;
- h1 = Long.rotateLeft(h1, 27);
- h1 += h2;
- h1 = h1 * 5 + 0x52dce729;
- k2 *= c2;
- k2 = Long.rotateLeft(k2, 33);
- k2 *= c1;
- h2 ^= k2;
- h2 = Long.rotateLeft(h2, 31);
- h2 += h1;
- h2 = h2 * 5 + 0x38495ab5;
- }
-
- long k1 = 0;
- long k2 = 0;
-
- switch (len & 15) {
- case 15:
- k2 = (key[roundedEnd + 14] & 0xffL) << 48;
- case 14:
- k2 |= (key[roundedEnd + 13] & 0xffL) << 40;
- case 13:
- k2 |= (key[roundedEnd + 12] & 0xffL) << 32;
- case 12:
- k2 |= (key[roundedEnd + 11] & 0xffL) << 24;
- case 11:
- k2 |= (key[roundedEnd + 10] & 0xffL) << 16;
- case 10:
- k2 |= (key[roundedEnd + 9] & 0xffL) << 8;
- case 9:
- k2 |= key[roundedEnd + 8] & 0xffL;
- k2 *= c2;
- k2 = Long.rotateLeft(k2, 33);
- k2 *= c1;
- h2 ^= k2;
- case 8:
- k1 = (long) key[roundedEnd + 7] << 56;
- case 7:
- k1 |= (key[roundedEnd + 6] & 0xffL) << 48;
- case 6:
- k1 |= (key[roundedEnd + 5] & 0xffL) << 40;
- case 5:
- k1 |= (key[roundedEnd + 4] & 0xffL) << 32;
- case 4:
- k1 |= (key[roundedEnd + 3] & 0xffL) << 24;
- case 3:
- k1 |= (key[roundedEnd + 2] & 0xffL) << 16;
- case 2:
- k1 |= (key[roundedEnd + 1] & 0xffL) << 8;
- case 1:
- k1 |= key[roundedEnd] & 0xffL;
- k1 *= c1;
- k1 = Long.rotateLeft(k1, 31);
- k1 *= c2;
- h1 ^= k1;
- }
-
- // ----------
- // finalization
-
- h1 ^= len;
- h2 ^= len;
-
- h1 += h2;
- h2 += h1;
-
- h1 = fmix64(h1);
- h2 = fmix64(h2);
-
- h1 += h2;
- h2 += h1;
-
- out.val1 = h1;
- out.val2 = h2;
- }
-
- /**
- * 128 bits of state
- */
- public static final class LongPair {
-
- public long val1;
- public long val2;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java
deleted file mode 100644
index 753940f655..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util.NoiseUtil;
-
-import java.util.Random;
-
-import com.github.bartimaeusnek.bartworks.API.INoiseGen;
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-
-import gregtech.api.objects.XSTR;
-
-public class BartsNoise implements INoiseGen {
-
- public void setUsePhase(boolean usePhase) {
- this.usePhase = usePhase;
- }
-
- public void setRandom(Random random) {
- this.random = random;
- }
-
- boolean usePhase;
- int octaves;
- double frequency;
- double amplitude;
- long seed;
- Random random;
-
- public enum NoiseColor {
-
- Red(-1),
- Pink(-0.5),
- White(0),
- Blue(0.5),
- Violet(1);
-
- NoiseColor(double num) {
- this.ampl = num;
- }
-
- double ampl;
-
- public BartsNoise getColoredNoise() {
- BartsNoise noise = new BartsNoise();
- noise.setAmplitude(this.ampl);
- return noise;
- }
- }
-
- public BartsNoise(int octaves, double frequency, double amplitude, long seed) {
- this.octaves = octaves;
- this.frequency = frequency;
- this.amplitude = amplitude;
- this.seed = seed;
- this.random = new XSTR(seed);
- }
-
- public BartsNoise() {
- this.seed = new XSTR().nextLong();
- this.random = new XSTR(this.seed);
- this.octaves = 1;
- this.frequency = this.random.nextGaussian();
- this.amplitude = this.random.nextGaussian();
- }
-
- public BartsNoise(long seed) {
- this.seed = seed;
- this.random = new XSTR(seed);
- this.octaves = 1;
- this.frequency = this.random.nextGaussian();
- this.amplitude = this.random.nextGaussian();
- }
-
- public BartsNoise copy() {
- return new BartsNoise(this.octaves, this.frequency, this.amplitude, this.seed);
- }
-
- public BartsNoise copy(long seed) {
- return new BartsNoise(this.octaves, this.frequency, this.amplitude, seed);
- }
-
- public double getCosNoise(double x, double y) {
- double pr = x * this.frequency;
- double r1 = Math.cos(pr);
- if (r1 < 0) r1 = Math.abs(r1);
- double result = Math.pow(r1, this.amplitude);
- double pr2 = y * this.frequency;
- double r2 = Math.cos(pr2);
- if (r2 < 0) r2 = Math.abs(r2);
- double result2 = Math.pow(r2, this.amplitude);
- result *= result2;
- if (result == Double.POSITIVE_INFINITY) result = Double.MAX_VALUE;
- if (result == Double.NEGATIVE_INFINITY) result = Double.MIN_VALUE;
- return MathUtils.wrap(result, 1D);
- }
-
- double getNonOctavedNoise(double x, double y) {
- double phase = SimplexNoise
- .noise(Math.pow(x * this.frequency, this.amplitude), Math.pow(y * this.frequency, this.amplitude));
- return MathUtils.wrap(phase, 1);
- }
-
- public double getNeighbouringNoise(int x, int y) {
- return (this.getNoiseSingle(x - 1, y - 1) + this.getNoiseSingle(x, y - 1)
- + this.getNoiseSingle(x - 1, y)
- + this.getNoiseSingle(x + 1, y)
- + this.getNoiseSingle(x, y + 1)
- + this.getNoiseSingle(x + 1, y + 1)
- + this.getNoiseSingle(x - 1, y + 1)
- + this.getNoiseSingle(x + 1, y - 1)) / 8;
- }
-
- public double getNoiseSingle(int x, int y) {
- double result = 0;
- for (double i = 1; i <= this.octaves; i++) {
- result += 1d / i * this.getNonOctavedNoise(i * x, i * y);
- }
- return result;
- }
-
- @Override
- public double getNoise(int x, int y) {
- double result = 0;
- for (double i = 1; i <= this.octaves; i++) {
- result += 1d / i * this.getNonOctavedNoise(i * x, y);
- }
- // result = (this.getNeighbouringNoise(x,y)+result)/2;
- return MathUtils.wrap(result, 1D);
- }
-
- @Override
- public double[][] getNoiseForRegion(int xStart, int zStart, int xEnd, int zEnd) {
- // double[][] results = new double[Math.abs(xEnd)-Math.abs(xStart)][Math.abs(zEnd)-Math.abs(zStart)];
- // for (int i = xStart; i < xEnd; i++) {
- // for (int j = zStart; j < zEnd; j++) {
- // results
- // }
- // }
- return new double[0][0];
- }
-
- @Override
- public void setAmplitude(double amplitude) {
- this.amplitude = amplitude;
- }
-
- @Override
- public void setOctaves(int octaves) {
- this.octaves = octaves;
- }
-
- @Override
- public void setFrequency(double freq) {
- this.frequency = freq;
- }
-
- @Override
- public void setSeed(long seed) {
- this.seed = seed;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java
deleted file mode 100644
index ca318e17b9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java
+++ /dev/null
@@ -1,396 +0,0 @@
-package com.github.bartimaeusnek.bartworks.util.NoiseUtil;
-/*
- * A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. Based on example code by Stefan Gustavson
- * (stegu@itn.liu.se). Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). Better rank ordering method by
- * Stefan Gustavson in 2012. This could be speeded up even further, but it's useful as it is. Version 2012-03-09 This
- * code was placed in the public domain by its original author, Stefan Gustavson. You may use it as you see fit, but
- * attribution is appreciated.
- */
-
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-
-public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
-
- private static Grad[] grad3 = { new Grad(1, 1, 0), new Grad(-1, 1, 0), new Grad(1, -1, 0), new Grad(-1, -1, 0),
- new Grad(1, 0, 1), new Grad(-1, 0, 1), new Grad(1, 0, -1), new Grad(-1, 0, -1), new Grad(0, 1, 1),
- new Grad(0, -1, 1), new Grad(0, 1, -1), new Grad(0, -1, -1) };
-
- private static Grad[] grad4 = { new Grad(0, 1, 1, 1), new Grad(0, 1, 1, -1), new Grad(0, 1, -1, 1),
- new Grad(0, 1, -1, -1), new Grad(0, -1, 1, 1), new Grad(0, -1, 1, -1), new Grad(0, -1, -1, 1),
- new Grad(0, -1, -1, -1), new Grad(1, 0, 1, 1), new Grad(1, 0, 1, -1), new Grad(1, 0, -1, 1),
- new Grad(1, 0, -1, -1), new Grad(-1, 0, 1, 1), new Grad(-1, 0, 1, -1), new Grad(-1, 0, -1, 1),
- new Grad(-1, 0, -1, -1), new Grad(1, 1, 0, 1), new Grad(1, 1, 0, -1), new Grad(1, -1, 0, 1),
- new Grad(1, -1, 0, -1), new Grad(-1, 1, 0, 1), new Grad(-1, 1, 0, -1), new Grad(-1, -1, 0, 1),
- new Grad(-1, -1, 0, -1), new Grad(1, 1, 1, 0), new Grad(1, 1, -1, 0), new Grad(1, -1, 1, 0),
- new Grad(1, -1, -1, 0), new Grad(-1, 1, 1, 0), new Grad(-1, 1, -1, 0), new Grad(-1, -1, 1, 0),
- new Grad(-1, -1, -1, 0) };
-
- private static short[] p = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103,
- 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117,
- 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48,
- 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102,
- 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188,
- 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82,
- 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154,
- 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185,
- 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249,
- 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138,
- 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 };
- // To remove the need for index wrapping, double the permutation table length
- private static short[] perm = new short[512];
- private static short[] permMod12 = new short[512];
-
- static {
- for (int i = 0; i < 512; i++) {
- perm[i] = p[i & 255];
- permMod12[i] = (short) (perm[i] % 12);
- }
- }
-
- // Skewing and unskewing factors for 2, 3, and 4 dimensions
- private static final double F2 = 0.5 * (Math.sqrt(3.0) - 1.0);
- private static final double G2 = (3.0 - Math.sqrt(3.0)) / 6.0;
- private static final double F3 = 1.0 / 3.0;
- private static final double G3 = 1.0 / 6.0;
- private static final double F4 = (Math.sqrt(5.0) - 1.0) / 4.0;
- private static final double G4 = (5.0 - Math.sqrt(5.0)) / 20.0;
-
- // This method is a *lot* faster than using (int)Math.floor(x)
- private static int fastfloor(double x) {
- return MathUtils.floorInt(x);
- }
-
- private static double dot(Grad g, double x, double y) {
- return g.x * x + g.y * y;
- }
-
- private static double dot(Grad g, double x, double y, double z) {
- return g.x * x + g.y * y + g.z * z;
- }
-
- private static double dot(Grad g, double x, double y, double z, double w) {
- return g.x * x + g.y * y + g.z * z + g.w * w;
- }
-
- // 2D simplex noise
- public static double noise(double xin, double yin) {
- double n0, n1, n2; // Noise contributions from the three corners
- // Skew the input space to determine which simplex cell we're in
- double s = (xin + yin) * F2; // Hairy factor for 2D
- int i = fastfloor(xin + s);
- int j = fastfloor(yin + s);
- double t = (i + j) * G2;
- double X0 = i - t; // Unskew the cell origin back to (x,y) space
- double Y0 = j - t;
- double x0 = xin - X0; // The x,y distances from the cell origin
- double y0 = yin - Y0;
- // For the 2D case, the simplex shape is an equilateral triangle.
- // Determine which simplex we are in.
- int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords
- if (x0 > y0) {
- i1 = 1;
- j1 = 0;
- } // lower triangle, XY order: (0,0)->(1,0)->(1,1)
- else {
- i1 = 0;
- j1 = 1;
- } // upper triangle, YX order: (0,0)->(0,1)->(1,1)
- // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
- // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
- // c = (3-sqrt(3))/6
- double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
- double y1 = y0 - j1 + G2;
- double x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords
- double y2 = y0 - 1.0 + 2.0 * G2;
- // Work out the hashed gradient indices of the three simplex corners
- int ii = i & 255;
- int jj = j & 255;
- int gi0 = permMod12[ii + perm[jj]];
- int gi1 = permMod12[ii + i1 + perm[jj + j1]];
- int gi2 = permMod12[ii + 1 + perm[jj + 1]];
- // Calculate the contribution from the three corners
- double t0 = 0.5 - x0 * x0 - y0 * y0;
- if (t0 < 0) n0 = 0.0;
- else {
- t0 *= t0;
- n0 = t0 * t0 * dot(grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient
- }
- double t1 = 0.5 - x1 * x1 - y1 * y1;
- if (t1 < 0) n1 = 0.0;
- else {
- t1 *= t1;
- n1 = t1 * t1 * dot(grad3[gi1], x1, y1);
- }
- double t2 = 0.5 - x2 * x2 - y2 * y2;
- if (t2 < 0) n2 = 0.0;
- else {
- t2 *= t2;
- n2 = t2 * t2 * dot(grad3[gi2], x2, y2);
- }
- // Add contributions from each corner to get the final noise value.
- // The result is scaled to return values in the interval [-1,1].
- return 70.0 * (n0 + n1 + n2);
- }
-
- // 3D simplex noise
- public static double noise(double xin, double yin, double zin) {
- double n0, n1, n2, n3; // Noise contributions from the four corners
- // Skew the input space to determine which simplex cell we're in
- double s = (xin + yin + zin) * F3; // Very nice and simple skew factor for 3D
- int i = fastfloor(xin + s);
- int j = fastfloor(yin + s);
- int k = fastfloor(zin + s);
- double t = (i + j + k) * G3;
- double X0 = i - t; // Unskew the cell origin back to (x,y,z) space
- double Y0 = j - t;
- double Z0 = k - t;
- double x0 = xin - X0; // The x,y,z distances from the cell origin
- double y0 = yin - Y0;
- double z0 = zin - Z0;
- // For the 3D case, the simplex shape is a slightly irregular tetrahedron.
- // Determine which simplex we are in.
- int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
- int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
- if (x0 >= y0) {
- if (y0 >= z0) {
- i1 = 1;
- j1 = 0;
- k1 = 0;
- i2 = 1;
- j2 = 1;
- k2 = 0;
- } // X Y Z order
- else {
- if (x0 >= z0) {
- i1 = 1;
- j1 = 0;
- k1 = 0;
- } // X Z Y order
- else {
- i1 = 0;
- j1 = 0;
- k1 = 1;
- }
- i2 = 1;
- j2 = 0;
- k2 = 1;
- } // Z X Y order
- } else if (y0 < z0) {
- i1 = 0;
- j1 = 0;
- k1 = 1;
- i2 = 0;
- j2 = 1;
- k2 = 1;
- } // Z Y X order
- else if (x0 < z0) {
- i1 = 0;
- j1 = 1;
- k1 = 0;
- i2 = 0;
- j2 = 1;
- k2 = 1;
- } // Y Z X order
- else {
- i1 = 0;
- j1 = 1;
- k1 = 0;
- i2 = 1;
- j2 = 1;
- k2 = 0;
- } // Y X Z order
- // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
- // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
- // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
- // c = 1/6.
- double x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
- double y1 = y0 - j1 + G3;
- double z1 = z0 - k1 + G3;
- double x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
- double y2 = y0 - j2 + 2.0 * G3;
- double z2 = z0 - k2 + 2.0 * G3;
- double x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
- double y3 = y0 - 1.0 + 3.0 * G3;
- double z3 = z0 - 1.0 + 3.0 * G3;
- // Work out the hashed gradient indices of the four simplex corners
- int ii = i & 255;
- int jj = j & 255;
- int kk = k & 255;
- int gi0 = permMod12[ii + perm[jj + perm[kk]]];
- int gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]];
- int gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]];
- int gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]];
- // Calculate the contribution from the four corners
- double t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
- if (t0 < 0) n0 = 0.0;
- else {
- t0 *= t0;
- n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0);
- }
- double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;
- if (t1 < 0) n1 = 0.0;
- else {
- t1 *= t1;
- n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1);
- }
- double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
- if (t2 < 0) n2 = 0.0;
- else {
- t2 *= t2;
- n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2);
- }
- double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
- if (t3 < 0) n3 = 0.0;
- else {
- t3 *= t3;
- n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3);
- }
- // Add contributions from each corner to get the final noise value.
- // The result is scaled to stay just inside [-1,1]
- return 32.0 * (n0 + n1 + n2 + n3);
- }
-
- // 4D simplex noise, better simplex rank ordering method 2012-03-09
- public static double noise(double x, double y, double z, double w) {
-
- double n0, n1, n2, n3, n4; // Noise contributions from the five corners
- // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
- double s = (x + y + z + w) * F4; // Factor for 4D skewing
- int i = fastfloor(x + s);
- int j = fastfloor(y + s);
- int k = fastfloor(z + s);
- int l = fastfloor(w + s);
- double t = (i + j + k + l) * G4; // Factor for 4D unskewing
- double X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
- double Y0 = j - t;
- double Z0 = k - t;
- double W0 = l - t;
- double x0 = x - X0; // The x,y,z,w distances from the cell origin
- double y0 = y - Y0;
- double z0 = z - Z0;
- double w0 = w - W0;
- // For the 4D case, the simplex is a 4D shape I won't even try to describe.
- // To find out which of the 24 possible simplices we're in, we need to
- // determine the magnitude ordering of x0, y0, z0 and w0.
- // Six pair-wise comparisons are performed between each possible pair
- // of the four coordinates, and the results are used to rank the numbers.
- int rankx = 0;
- int ranky = 0;
- int rankz = 0;
- int rankw = 0;
- if (x0 > y0) rankx++;
- else ranky++;
- if (x0 > z0) rankx++;
- else rankz++;
- if (x0 > w0) rankx++;
- else rankw++;
- if (y0 > z0) ranky++;
- else rankz++;
- if (y0 > w0) ranky++;
- else rankw++;
- if (z0 > w0) rankz++;
- else rankw++;
- int i1, j1, k1, l1; // The integer offsets for the second simplex corner
- int i2, j2, k2, l2; // The integer offsets for the third simplex corner
- int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner
- // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
- // Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w
- // impossible. Only the 24 indices which have non-zero entries make any sense.
- // We use a thresholding to set the coordinates in turn from the largest magnitude.
- // Rank 3 denotes the largest coordinate.
- i1 = rankx >= 3 ? 1 : 0;
- j1 = ranky >= 3 ? 1 : 0;
- k1 = rankz >= 3 ? 1 : 0;
- l1 = rankw >= 3 ? 1 : 0;
- // Rank 2 denotes the second largest coordinate.
- i2 = rankx >= 2 ? 1 : 0;
- j2 = ranky >= 2 ? 1 : 0;
- k2 = rankz >= 2 ? 1 : 0;
- l2 = rankw >= 2 ? 1 : 0;
- // Rank 1 denotes the second smallest coordinate.
- i3 = rankx >= 1 ? 1 : 0;
- j3 = ranky >= 1 ? 1 : 0;
- k3 = rankz >= 1 ? 1 : 0;
- l3 = rankw >= 1 ? 1 : 0;
- // The fifth corner has all coordinate offsets = 1, so no need to compute that.
- double x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
- double y1 = y0 - j1 + G4;
- double z1 = z0 - k1 + G4;
- double w1 = w0 - l1 + G4;
- double x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
- double y2 = y0 - j2 + 2.0 * G4;
- double z2 = z0 - k2 + 2.0 * G4;
- double w2 = w0 - l2 + 2.0 * G4;
- double x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
- double y3 = y0 - j3 + 3.0 * G4;
- double z3 = z0 - k3 + 3.0 * G4;
- double w3 = w0 - l3 + 3.0 * G4;
- double x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
- double y4 = y0 - 1.0 + 4.0 * G4;
- double z4 = z0 - 1.0 + 4.0 * G4;
- double w4 = w0 - 1.0 + 4.0 * G4;
- // Work out the hashed gradient indices of the five simplex corners
- int ii = i & 255;
- int jj = j & 255;
- int kk = k & 255;
- int ll = l & 255;
- int gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32;
- int gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32;
- int gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32;
- int gi3 = perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32;
- int gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32;
- // Calculate the contribution from the five corners
- double t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
- if (t0 < 0) n0 = 0.0;
- else {
- t0 *= t0;
- n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0);
- }
- double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
- if (t1 < 0) n1 = 0.0;
- else {
- t1 *= t1;
- n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1);
- }
- double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
- if (t2 < 0) n2 = 0.0;
- else {
- t2 *= t2;
- n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2);
- }
- double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
- if (t3 < 0) n3 = 0.0;
- else {
- t3 *= t3;
- n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3);
- }
- double t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
- if (t4 < 0) n4 = 0.0;
- else {
- t4 *= t4;
- n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4);
- }
- // Sum up and scale the result to cover the range [-1,1]
- return 27.0 * (n0 + n1 + n2 + n3 + n4);
- }
-
- // Inner class to speed upp gradient computations
- // (array access is a lot slower than member access)
- private static class Grad {
-
- double x, y, z, w;
-
- Grad(double x, double y, double z) {
- this.x = x;
- this.y = y;
- this.z = z;
- }
-
- Grad(double x, double y, double z, double w) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java
deleted file mode 100644
index 33173d19f2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-
-public class NonNullWrappedHashMap<K, V> extends HashMap<K, V> {
-
- private static final long serialVersionUID = 46345163103910175L;
- private V defaultValue;
-
- public NonNullWrappedHashMap(int initialCapacity, float loadFactor, V defaultValue) {
- super(initialCapacity, loadFactor);
- this.defaultValue = Objects.requireNonNull(defaultValue);
- }
-
- public NonNullWrappedHashMap(int initialCapacity, V defaultValue) {
- super(initialCapacity);
- this.defaultValue = Objects.requireNonNull(defaultValue);
- }
-
- public NonNullWrappedHashMap(V defaultValue) {
- this.defaultValue = Objects.requireNonNull(defaultValue);
- }
-
- public NonNullWrappedHashMap(Map<? extends K, ? extends V> m, V defaultValue) {
- super(m);
- this.defaultValue = Objects.requireNonNull(defaultValue);
- }
-
- @Override
- public V get(Object key) {
- return this.getOrDefault(key, this.defaultValue);
- }
-
- @Override
- public V getOrDefault(Object key, V defaultValue) {
- return Objects.requireNonNull(
- Optional.ofNullable(super.getOrDefault(key, defaultValue))
- .orElse(this.defaultValue));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java
deleted file mode 100644
index 5490c4bdaf..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-public class NonNullWrappedHashSet<E> extends HashSet<E> {
-
- private static final long serialVersionUID = 8377161849188229010L;
-
- public NonNullWrappedHashSet() {}
-
- public NonNullWrappedHashSet(Collection<? extends E> c) {
- this.addAll(c);
- }
-
- public NonNullWrappedHashSet(int initialCapacity, float loadFactor) {
- super(initialCapacity, loadFactor);
- }
-
- public NonNullWrappedHashSet(int initialCapacity) {
- super(initialCapacity);
- }
-
- @Override
- public boolean add(E e) {
- if (e != null) return super.add(e);
- return false;
- }
-
- @Override
- public boolean addAll(Collection<? extends E> c) {
- boolean wasChanged = false;
- for (E element : c) {
- if (element != null) wasChanged |= this.add(element);
- }
- return wasChanged;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java
deleted file mode 100644
index cd9bc1746e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Map;
-
-@SuppressWarnings("unchecked")
-public class Pair<A, B> implements Map.Entry<A, B> {
-
- Object[] pair = new Object[2];
-
- public Pair(Object[] pair) {
- this.pair = pair;
- }
-
- public Pair(A k, B v) {
- this.pair[0] = k;
- this.pair[1] = v;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof Pair)) return false;
-
- Pair<?, ?> pair1 = (Pair<?, ?>) o;
-
- // Probably incorrect - comparing Object[] arrays with Arrays.equals
- return Arrays.equals(this.pair, pair1.pair);
- }
-
- @Override
- public int hashCode() {
- return MurmurHash3.murmurhash3_x86_32(
- ByteBuffer.allocate(8)
- .putInt(this.pair[0].hashCode())
- .putInt(this.pair[1].hashCode())
- .array(),
- 0,
- 8,
- 31);
- }
-
- @Override
- public A getKey() {
- return (A) this.pair[0];
- }
-
- @Override
- public B getValue() {
- return (B) this.pair[1];
- }
-
- @Override
- public B setValue(Object value) {
- this.pair[1] = value;
- return (B) this.pair[1];
- }
-
- public Pair<A, B> copyWithNewValue(B value) {
- return new Pair<>((A) this.pair[0], value);
- }
-
- public Pair<A, B> replaceValue(B value) {
- this.setValue(value);
- return this;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java
deleted file mode 100644
index d0850b20c5..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
-
-/**
- * Handle the parallel more efficient.
- *
- * @author GlodBlock
- */
-public class RecipeFinderForParallel {
-
- /**
- * This method is used for mega multis which have extremely high parallel. Never use it for non parallel machines,
- * it will have worse performance. It will auto consume the inputs.
- *
- * @param aRecipe The target recipe that you want calculate the parallel
- * @param aFluidInputs The input fluid from machine
- * @param aItemStacks The input item from machine
- * @param aMaxParallel The max parallel that it can reach
- * @return The parallel that it can reach
- */
- public static int handleParallelRecipe(GT_Recipe aRecipe, FluidStack[] aFluidInputs, ItemStack[] aItemStacks,
- int aMaxParallel) {
- if (aFluidInputs == null) aFluidInputs = new FluidStack[0];
- if (aItemStacks == null) aItemStacks = new ItemStack[0];
- HashMap<Integer, Integer> tCompressedFluidInput = compressFluid(aFluidInputs);
- HashMap<Integer, Integer> tCompressedItemInput = compressItem(aItemStacks);
- HashMap<Integer, Integer> tCompressedFluidRecipe = compressFluid(aRecipe.mFluidInputs);
- HashMap<Integer, Integer> tCompressedItemRecipe = compressItem(aRecipe.mInputs);
- int tCurrentPara = aMaxParallel;
- for (int tFluid : tCompressedFluidRecipe.keySet()) {
- if (tCompressedFluidInput.containsKey(tFluid) && tCompressedFluidRecipe.get(tFluid) != 0) {
- tCurrentPara = Math
- .min(tCurrentPara, tCompressedFluidInput.get(tFluid) / tCompressedFluidRecipe.get(tFluid));
- }
- }
- for (int tItem : tCompressedItemRecipe.keySet()) {
- /* Wildcard Stuff */
- if (tItem >> 16 == Short.MAX_VALUE) {
- int tCountWildcard = 0;
- for (int tInputItem : tCompressedItemInput.keySet()) {
- if ((tInputItem & 0xffff) == (tItem & 0xffff)) {
- tCountWildcard += tCompressedItemInput.get(tInputItem);
- }
- }
- tCurrentPara = Math.min(tCurrentPara, tCountWildcard / tCompressedItemRecipe.get(tItem));
- } else if (tCompressedItemRecipe.get(tItem) != 0) {
- /* OreDict Stuff */
- int tCountOre = 0;
- ItemStack tRealRecipe = GT_Utility.intToStack(tItem);
- for (int tInputItem : tCompressedItemInput.keySet()) {
- ItemStack tRealStack = GT_Utility.intToStack(tInputItem);
- if (GT_OreDictUnificator.isInputStackEqual(tRealStack, tRealRecipe)) {
- tCountOre += tCompressedItemInput.get(tInputItem);
- }
- }
- tCurrentPara = Math.min(tCurrentPara, tCountOre / tCompressedItemRecipe.get(tItem));
- }
- }
-
- for (int tFluid : tCompressedFluidRecipe.keySet()) {
- int tOldSize = tCompressedFluidRecipe.get(tFluid);
- tCompressedFluidRecipe.put(tFluid, tOldSize * tCurrentPara);
- }
- for (int tItem : tCompressedItemRecipe.keySet()) {
- int tOldSize = tCompressedItemRecipe.get(tItem);
- tCompressedItemRecipe.put(tItem, tOldSize * tCurrentPara);
- }
-
- for (FluidStack tFluid : aFluidInputs) {
- if (tFluid != null && tCompressedFluidRecipe.containsKey(tFluid.getFluidID())) {
- if (tFluid.amount >= tCompressedFluidRecipe.get(tFluid.getFluidID())) {
- tFluid.amount -= tCompressedFluidRecipe.get(tFluid.getFluidID());
- tCompressedFluidRecipe.remove(tFluid.getFluidID());
- } else {
- tCompressedFluidRecipe
- .put(tFluid.getFluidID(), tCompressedFluidRecipe.get(tFluid.getFluidID()) - tFluid.amount);
- tFluid.amount = 0;
- }
- }
- }
-
- /* OreDict Stuff */
- /* Wildcard Stuff */
- for (Iterator<Integer> i = tCompressedItemRecipe.keySet()
- .iterator(); i.hasNext();) {
- int tItem = i.next();
- if (tItem >> 16 == Short.MAX_VALUE) {
- for (ItemStack tInputItem : aItemStacks) {
- int InputID = GT_Utility.stackToInt(tInputItem);
- if ((InputID & 0xffff) == (tItem & 0xffff)) {
- if (tInputItem.stackSize >= tCompressedItemRecipe.get(tItem)) {
- tInputItem.stackSize -= tCompressedItemRecipe.get(tItem);
- i.remove();
- break;
- }
- tCompressedItemRecipe.put(tItem, tCompressedItemRecipe.get(tItem) - tInputItem.stackSize);
- tInputItem.stackSize = 0;
- }
- }
- } else {
- ItemStack tRealRecipe = GT_Utility.intToStack(tItem);
- int tTargetAmount = tCompressedItemRecipe.get(tItem);
- for (ItemStack input : aItemStacks) {
- if (GT_OreDictUnificator.isInputStackEqual(input, tRealRecipe)) {
- int d = Math.min(tTargetAmount, input.stackSize);
- tTargetAmount -= d;
- tCompressedItemRecipe.put(tItem, tTargetAmount);
- input.stackSize -= d;
- }
- if (tTargetAmount == 0) {
- i.remove();
- break;
- }
- }
- }
- }
-
- return tCurrentPara;
- }
-
- /**
- * Get the proper packed output stacks
- *
- * @param aRecipe The target recipe
- * @param aPall The parallel it has
- * @return A pair of the output fluid and item stack, the first value is fluid, the second is item.
- */
- public static Pair<ArrayList<FluidStack>, ArrayList<ItemStack>> getMultiOutput(GT_Recipe aRecipe, int aPall) {
- ArrayList<FluidStack> tFluidList = new ArrayList<>();
- ArrayList<ItemStack> tItemList = new ArrayList<>();
- if (aRecipe == null) return new Pair<>(tFluidList, tItemList);
- if (aRecipe.mFluidOutputs != null && aRecipe.mFluidOutputs.length > 0) {
- for (FluidStack tFluid : aRecipe.mFluidOutputs) {
- if (tFluid != null && tFluid.amount > 0) {
- tFluidList.add(new FluidStack(tFluid.getFluid(), tFluid.amount * aPall));
- }
- }
- }
- if (aRecipe.mOutputs != null && aRecipe.mOutputs.length > 0) {
- for (ItemStack tItem : aRecipe.mOutputs) {
- if (tItem != null && tItem.stackSize > 0) {
- int tAmount = tItem.stackSize * aPall;
- while (tAmount > tItem.getMaxStackSize()) {
- tItemList.add(GT_Utility.copyAmount(tItem.getMaxStackSize(), tItem));
- tAmount -= tItem.getMaxStackSize();
- }
- tItemList.add(GT_Utility.copyAmount(tAmount, tItem));
- }
- }
- }
- return new Pair<>(tFluidList, tItemList);
- }
-
- public static HashMap<Integer, Integer> compressItem(ItemStack[] aItemStacks) {
- HashMap<Integer, Integer> tCompressed = new HashMap<>();
- for (ItemStack tItem : aItemStacks) {
- if (tItem != null) {
- int tItemID = GT_Utility.stackToInt(tItem);
- int tItemSize = tItem.stackSize;
- tCompressed.merge(tItemID, tItemSize, Integer::sum);
- }
- }
- return tCompressed;
- }
-
- public static HashMap<Integer, Integer> compressFluid(FluidStack[] aFluidStack) {
- HashMap<Integer, Integer> tCompressed = new HashMap<>();
- for (FluidStack tFluid : aFluidStack) {
- if (tFluid != null) {
- int tFluidID = tFluid.getFluidID();
- int tFluidSize = tFluid.amount;
- tCompressed.merge(tFluidID, tFluidSize, Integer::sum);
- }
- }
- return tCompressed;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java
deleted file mode 100644
index b6216f3c42..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.github.bartimaeusnek.bartworks.util;
-
-import net.minecraft.network.PacketBuffer;
-import net.minecraft.util.StatCollector;
-
-import gregtech.api.recipe.check.CheckRecipeResult;
-import gregtech.api.util.GT_Utility;
-
-public class ResultWrongSievert implements CheckRecipeResult {
-
- public enum NeededSievertType {
- EXACTLY,
- MINIMUM
- }
-
- private NeededSievertType type;
- private int required;
-
- public ResultWrongSievert(int required, NeededSievertType type) {
- this.required = required;
- this.type = type;
- }
-
- public String getID() {
- return "wrong_sievert";
- }
-
- @Override
- public boolean wasSuccessful() {
- return false;
- }
-
- @Override
- public String getDisplayString() {
- return switch (this.type) {
- case EXACTLY -> StatCollector.translateToLocalFormatted(
- "GT5U.gui.text.wrong_sievert_exactly",
- GT_Utility.formatNumbers(this.required));
- case MINIMUM -> StatCollector
- .translateToLocalFormatted("GT5U.gui.text.wrong_sievert_min", GT_Utility.formatNumbers(this.required));
- };
- }
-
- @Override
- public CheckRecipeResult newInstance() {
- return new ResultWrongSievert(0, NeededSievertType.EXACTLY);
- }
-
- @Override
- public void encode(PacketBuffer buffer) {
- buffer.writeVarIntToBuffer(this.required);
- buffer.writeVarIntToBuffer(this.type.ordinal());
- }
-
- @Override
- public void decode(PacketBuffer buffer) {
- this.required = buffer.readVarIntFromBuffer();
- this.type = NeededSievertType.values()[buffer.readVarIntFromBuffer()];
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass()) return false;
- ResultWrongSievert that = (ResultWrongSievert) o;
- return this.required == that.required;
- }
-
- /**
- * Cannot process recipe because the machine doesn't have the minimum amount of sievert
- */
- public static CheckRecipeResult insufficientSievert(int required) {
- return new ResultWrongSievert(required, NeededSievertType.MINIMUM);
- }
-
- /**
- * Cannot process recipe because the machine doesn't have the exact amount of sievert
- */
- public static CheckRecipeResult wrongSievert(int required) {
- return new ResultWrongSievert(required, NeededSievertType.EXACTLY);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java
deleted file mode 100644
index 4c1c82b9bf..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util;
-
-import java.util.Optional;
-import java.util.function.Predicate;
-
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.util.GT_Recipe;
-
-public class StreamUtils {
-
- private StreamUtils() {}
-
- public static Predicate<RecipeMap<?>> filterVisualMaps() {
- return recipeMap -> {
- Optional<GT_Recipe> op = recipeMap.getAllRecipes()
- .stream()
- .findAny();
- return op.isPresent() && !op.get().mFakeRecipe;
- };
- }
-
- public static boolean filterVisualMaps(RecipeMap<?> recipeMap) {
- return filterVisualMaps().test(recipeMap);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java
deleted file mode 100644
index 241f20c1f9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util.accessprioritylist;
-
-import java.util.Collection;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-import java.util.Spliterator;
-
-import org.apache.commons.lang3.NotImplementedException;
-
-public class AccessPriorityList<E> implements List<E>, Deque<E>, Set<E> {
-
- transient int size = 0;
- transient AccessPriorityListNode<E> head;
- transient AccessPriorityListNode<E> tail;
-
- public static <E> AccessPriorityList<E> create() {
- return new AccessPriorityList<>();
- }
-
- public AccessPriorityList() {}
-
- @Override
- public void addFirst(E t) {
- final AccessPriorityListNode<E> first = this.head;
- final AccessPriorityListNode<E> newNode = new AccessPriorityListNode<>(null, t, first);
- this.head = newNode;
- if (first == null) this.tail = newNode;
- else first.setBefore(newNode);
- this.size++;
- }
-
- @Override
- public void addLast(E t) {
- final AccessPriorityListNode<E> last = this.tail;
- final AccessPriorityListNode<E> newNode = new AccessPriorityListNode<>(last, t, null);
- this.tail = newNode;
- if (last == null) this.head = newNode;
- else last.setNext(newNode);
- this.size++;
- }
-
- @Override
- public boolean offerFirst(E e) {
- throw new NotImplementedException("");
- }
-
- @Override
- public boolean offerLast(E e) {
- throw new NotImplementedException("");
- }
-
- @Override
- public E removeFirst() {
- E first = this.head.getELEMENT();
- AccessPriorityListNode<E> node = this.head;
- this.head = node.getNext();
- this.head.setBefore(null);
- node.destroy();
- node = null;
- this.size--;
- return first;
- }
-
- @Override
- public E removeLast() {
- E last = this.tail.getELEMENT();
- AccessPriorityListNode<E> node = this.tail;
- this.tail = node.getBefore();
- this.tail.setNext(null);
- node.destroy();
- node = null;
- this.size--;
- return last;
- }
-
- @Override
- public E pollFirst() {
- throw new NotImplementedException("");
- }
-
- @Override
- public E pollLast() {
- throw new NotImplementedException("");
- }
-
- @Override
- public E getFirst() {
- return this.peekFirst();
- }
-
- @Override
- public E getLast() {
- return this.peekLast();
- }
-
- @Override
- public E peekFirst() {
- return this.head != null ? this.head.getELEMENT() : null;
- }
-
- @Override
- public E peekLast() {
- return this.tail != null ? this.tail.getELEMENT() : null;
- }
-
- @Override
- public boolean removeFirstOccurrence(Object o) {
- throw new NotImplementedException("");
- }
-
- @Override
- public boolean removeLastOccurrence(Object o) {
- throw new NotImplementedException("");
- }
-
- @Override
- public int size() {
- return this.size;
- }
-
- @Override
- public boolean isEmpty() {
- return this.size == 0;
- }
-
- @Override
- public boolean contains(Object o) {
- throw new NotImplementedException("");
- }
-
- @Override
- public Iterator<E> iterator() {
- return new AccessPriorityListIterators.AccessPriorityListIterator<>(this.head);
- }
-
- public Iterator<AccessPriorityListNode<E>> nodeIterator() {
- return new AccessPriorityListIterators.AccessPriorityListNodeIterator<>(this.head);
- }
-
- @Override
- public Iterator<E> descendingIterator() {
- return new AccessPriorityListIterators.AccessPriorityListReverseIterator<>(this.tail);
- }
-
- @Override
- public Object[] toArray() {
- Object[] ret = new Object[this.size];
- int index = 0;
- for (Iterator<E> it = this.iterator(); it.hasNext(); index++) ret[index] = it.next();
- return ret;
- }
-
- @Override
- public <T> T[] toArray(T[] a) {
- T[] ret = (T[]) new Object[this.size];
- int index = 0;
- for (Iterator<T> it = (Iterator<T>) this.iterator(); it.hasNext(); index++) ret[index] = it.next();
- return ret;
- }
-
- @Override
- public boolean add(E e) {
- this.addLast(e);
- return true;
- }
-
- private void moveNodeUp(AccessPriorityListNode<E> node) {
- if (node == this.head || node.getBefore() == null) return;
- final AccessPriorityListNode<E> before = node.getBefore();
- final AccessPriorityListNode<E> beforeBefore = before.getBefore();
- final AccessPriorityListNode<E> next = node.getNext();
-
- // <0,1,2> <1,2,3> N<2,3,4> <3,4,5>
-
- node.setBefore(beforeBefore);
- // <0,1,2> <1,2,3> N<0,3,4> <3,4,5>
-
- if (beforeBefore != null) beforeBefore.setNext(node);
- else this.head = node;
- // <0,1,3> <1,2,3> N<0,3,4> <3,4,5>
-
- before.setBefore(node);
- // <0,1,3> <3,2,3> N<0,3,4> <3,4,5>
-
- before.setNext(next);
- // <0,1,3> <3,2,4> N<0,3,4> <3,4,5>
-
- if (next != null) next.setBefore(before);
- else this.tail = before;
- // <0,1,3> N<0,3,4> <3,2,4> <2,4,5>
-
- node.setNext(before);
- // <0,1,3> N<0,3,2> <3,2,4> <2,4,5>
- }
-
- AccessPriorityListNode<E> getNode(int index) {
- if (index <= this.size / 2) {
- AccessPriorityListNode<E> x = this.head;
- for (int i = 0; i < index; i++) x = x.getNext();
- return x;
- }
- AccessPriorityListNode<E> x = this.tail;
- for (int i = this.size - 1; i > index; i--) x = x.getBefore();
- return x;
- }
-
- @Override
- public boolean offer(E e) {
- throw new NotImplementedException("");
- }
-
- private boolean isValidIndex(int index) {
- if (index >= 0 && index < this.size) return true;
- throw new ArrayIndexOutOfBoundsException("NOT A VAILD INDEX!");
- }
-
- @Override
- public E remove() {
- throw new NotImplementedException("");
- }
-
- @Override
- public E poll() {
- return this.removeFirst();
- }
-
- @Override
- public E element() {
- throw new NotImplementedException("");
- }
-
- @Override
- public E peek() {
- return this.getFirst();
- }
-
- @Override
- public void push(E e) {
- this.addFirst(e);
- }
-
- @Override
- public E pop() {
- return this.removeFirst();
- }
-
- @Override
- public boolean remove(Object o) {
- // Object p;
- // for (Iterator it = this.iterator(); it.hasNext(); o.equals(p)){
- // p = it.next();
- // }
- throw new NotImplementedException("");
- }
-
- @Override
- public boolean containsAll(Collection<?> c) {
- throw new NotImplementedException("");
- }
-
- @Override
- public boolean addAll(Collection<? extends E> c) {
- if (c == null) return false;
- c.forEach(this::addLast);
- return true;
- }
-
- @Override
- public boolean addAll(int index, Collection<? extends E> c) {
- throw new NotImplementedException("");
- }
-
- @Override
- public boolean removeAll(Collection<?> c) {
- throw new NotImplementedException("");
- }
-
- @Override
- public boolean retainAll(Collection<?> c) {
- throw new NotImplementedException("");
- }
-
- @Override
- public void clear() {
- if (this.tail != null) {
- AccessPriorityListNode<E> node = this.tail;
- while (node.getBefore() != null) {
- node.setNext(null);
- node.setPriority(0L);
- node = node.getBefore();
- node.getNext()
- .setBefore(null);
- }
- this.size = 0;
- this.head = null;
- this.tail = null;
- }
- }
-
- public void addPrioToNode(AccessPriorityListNode<E> node) {
- this.addPrioToNode(node, 1L);
- }
-
- public void addPrioToNode(AccessPriorityListNode<E> node, long prio) {
- long current = node.getPriority();
- if (current == Long.MAX_VALUE || current > 0 && prio > 0 && prio + current < 0)
- node.setPriority(Long.MAX_VALUE);
- else node.setPriority(current + prio);
- while (node.getBefore() != null && node.getPriority() >= node.getBefore()
- .getPriority()) {
- this.moveNodeUp(node);
- }
- }
-
- public void addPrioToNode(int index, long prio) {
- if (!this.isValidIndex(index)) return;
- AccessPriorityListNode<E> node = this.getNode(index);
- this.addPrioToNode(node, prio);
- }
-
- public void addPrioToNode(int index) {
- this.addPrioToNode(index, 1L);
- }
-
- @Override
- public E get(int index) {
- if (!this.isValidIndex(index)) return null;
- AccessPriorityListNode<E> node = this.getNode(index);
- return node.getELEMENT();
- }
-
- @Override
- public E set(int index, E element) {
- throw new NotImplementedException("");
- }
-
- @Override
- public void add(int index, E element) {
- throw new NotImplementedException("");
- }
-
- @Override
- public E remove(int index) {
- throw new NotImplementedException("");
- }
-
- @Override
- public int indexOf(Object o) {
- throw new NotImplementedException("");
- }
-
- @Override
- public int lastIndexOf(Object o) {
- throw new NotImplementedException("");
- }
-
- @Override
- public ListIterator<E> listIterator() {
- return new AccessPriorityListIterators.AccessPriorityListListIterator<>(this.head, this.tail, false);
- }
-
- @Override
- public ListIterator<E> listIterator(int index) {
- return new AccessPriorityListIterators.AccessPriorityListListIterator<>(this, index);
- }
-
- @Override
- public List<E> subList(int fromIndex, int toIndex) {
- throw new NotImplementedException("");
- }
-
- @Override
- public Spliterator<E> spliterator() {
- throw new NotImplementedException("");
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java
deleted file mode 100644
index f24105db17..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util.accessprioritylist;
-
-import java.util.Iterator;
-import java.util.ListIterator;
-
-import org.apache.commons.lang3.NotImplementedException;
-
-public class AccessPriorityListIterators {
-
- public static class AccessPriorityListListIterator<E> implements ListIterator<E> {
-
- final AccessPriorityListNode<E> head;
- final AccessPriorityListNode<E> tail;
- AccessPriorityListNode<E> current;
- int counter = 0;
- boolean reverse;
-
- public AccessPriorityListListIterator(AccessPriorityListNode<E> head, AccessPriorityListNode<E> tail,
- boolean reverse) {
- this.head = head;
- this.tail = tail;
- this.current = reverse ? tail : head;
- this.reverse = reverse;
- }
-
- public AccessPriorityListListIterator(AccessPriorityList<E> list, int index) {
- this.head = list.head;
- this.tail = list.tail;
- this.current = list.getNode(index);
- this.counter = index;
- }
-
- @Override
- public boolean hasNext() {
- return this.reverse ? this.head != this.current : this.tail != this.current;
- }
-
- @Override
- public E next() {
- this.counter++;
- E ret = this.current.getELEMENT();
- this.current = this.current.getNext();
- return ret;
- }
-
- @Override
- public boolean hasPrevious() {
- return !this.reverse ? this.head != this.current : this.tail != this.current;
- }
-
- @Override
- public E previous() {
- this.counter--;
- E ret = this.current.getELEMENT();
- this.current = this.current.getBefore();
- return ret;
- }
-
- @Override
- public int nextIndex() {
- return this.counter + 1;
- }
-
- @Override
- public int previousIndex() {
- return this.counter - 1;
- }
-
- @Override
- public void remove() {
- throw new NotImplementedException("Not Implemented");
- }
-
- @Override
- public void set(E e) {
- throw new NotImplementedException("Not Implemented");
- }
-
- @Override
- public void add(E e) {
- throw new NotImplementedException("Not Implemented");
- }
- }
-
- public static class AccessPriorityListIterator<E> implements Iterator<E> {
-
- final AccessPriorityListNode<E> head;
- AccessPriorityListNode<E> current;
-
- public AccessPriorityListIterator(AccessPriorityListNode<E> head) {
- this.head = this.current = head;
- }
-
- @Override
- public boolean hasNext() {
- return this.current != null;
- }
-
- @Override
- public E next() {
- E ret = this.current.getELEMENT();
- this.current = this.current.getNext();
- return ret;
- }
- }
-
- public static class AccessPriorityListReverseIterator<E> implements Iterator<E> {
-
- final AccessPriorityListNode<E> tail;
- AccessPriorityListNode<E> current;
-
- public AccessPriorityListReverseIterator(AccessPriorityListNode<E> tail) {
- this.tail = this.current = tail;
- }
-
- @Override
- public boolean hasNext() {
- return this.current != null;
- }
-
- @Override
- public E next() {
- E ret = this.current.getELEMENT();
- this.current = this.current.getBefore();
- return ret;
- }
- }
-
- public static class AccessPriorityListNodeIterator<E> implements Iterator<AccessPriorityListNode<E>> {
-
- final AccessPriorityListNode<E> head;
- AccessPriorityListNode<E> current;
-
- public AccessPriorityListNodeIterator(AccessPriorityListNode<E> head) {
- this.head = this.current = head;
- }
-
- @Override
- public boolean hasNext() {
- return this.current != null;
- }
-
- @Override
- public AccessPriorityListNode<E> next() {
- AccessPriorityListNode<E> ret = this.current;
- this.current = this.current.getNext();
- return ret;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java
deleted file mode 100644
index 72b266917f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2018-2019 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util.accessprioritylist;
-
-public class AccessPriorityListNode<E> {
-
- public static final AccessPriorityListNode<?> EMPTY_NODE = new AccessPriorityListNode<>(null);
-
- private final E ELEMENT;
- private long priority = Long.MIN_VALUE;
- private AccessPriorityListNode<E> next;
- private AccessPriorityListNode<E> before;
-
- public AccessPriorityListNode(E element) {
- this.ELEMENT = element;
- }
-
- public AccessPriorityListNode(AccessPriorityListNode<E> before, E element, AccessPriorityListNode<E> next) {
- this.ELEMENT = element;
- this.connect(next, before);
- }
-
- public void connect(AccessPriorityListNode<E> next, AccessPriorityListNode<E> before) {
- this.setNext(next);
- this.setBefore(before);
- }
-
- public E getELEMENT() {
- return this.ELEMENT;
- }
-
- public long getPriority() {
- return this.priority;
- }
-
- public void setPriority(long priority) {
- this.priority = priority;
- }
-
- public AccessPriorityListNode<E> getNext() {
- return this.next;
- }
-
- public void setNext(AccessPriorityListNode<E> next) {
- this.next = next;
- }
-
- public AccessPriorityListNode<E> getBefore() {
- return this.before;
- }
-
- public void setBefore(AccessPriorityListNode<E> before) {
- this.before = before;
- }
-
- void destroy() {
- this.before = null;
- this.next = null;
- this.priority = 0L;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java
deleted file mode 100644
index d797e68d8a..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util.flowerset;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.Function;
-
-public class FlowerSet<T> implements Set<T> {
-
- public FlowerSet(int petals, Function<FlowerNode<T>, Integer> comparerison) {
- this.petals = petals;
- this.comparerison = comparerison;
- }
-
- final int petals;
- final Function<FlowerNode<T>, Integer> comparerison;
-
- public static <U> FlowerSet<U> createBase64(Function<FlowerNode<U>, Integer> comparerison) {
- return new FlowerSet<>(64, comparerison);
- }
-
- public static <U> FlowerSet<U> createHexflower(Function<FlowerNode<U>, Integer> comparerison) {
- return new FlowerSet<>(16, comparerison);
- }
-
- @Override
- public int size() {
- return 0;
- }
-
- @Override
- public boolean isEmpty() {
- return false;
- }
-
- @Override
- public boolean contains(Object o) {
- return false;
- }
-
- @Override
- public Iterator<T> iterator() {
- return null;
- }
-
- @Override
- public Object[] toArray() {
- return new Object[0];
- }
-
- @Override
- public <T1> T1[] toArray(T1[] a) {
- return null;
- }
-
- @Override
- public boolean add(T t) {
- return false;
- }
-
- @Override
- public boolean remove(Object o) {
- return false;
- }
-
- @Override
- public boolean containsAll(Collection<?> c) {
- return false;
- }
-
- @Override
- public boolean addAll(Collection<? extends T> c) {
- return false;
- }
-
- @Override
- public boolean retainAll(Collection<?> c) {
- return false;
- }
-
- @Override
- public boolean removeAll(Collection<?> c) {
- return false;
- }
-
- @Override
- public void clear() {}
-
- static class FlowerNode<V> {
-
- private final FlowerSet<V> map;
- final V value;
- final FlowerNode<V>[] links;
-
- @SuppressWarnings("unchecked")
- public FlowerNode(V value, FlowerSet<V> map) {
- this.value = value;
- this.map = map;
- this.links = new FlowerNode[map.petals];
- }
-
- private static final int DEPTH = 20480;
-
- public void TryToSetSingleNode(FlowerNode<V> node, FlowerNode<V> toset, int place, int depth) {
- if (depth > DEPTH) throw new IllegalStateException("Recursive Call went too deep.");
- if (node.links[place] == null) node.links[place] = toset;
- else {
- this.TryToSetSingleNode(node.links[place], toset, place, depth);
- depth++;
- }
- }
-
- public void TryToSetSingleNode(FlowerNode<V> node, FlowerNode<V> toset, int place) {
- if (node.links[place] == null) node.links[place] = toset;
- else this.TryToSetSingleNode(node.links[place], toset, place, 0);
- }
-
- @SafeVarargs
- public final void SetUpLinks(FlowerNode<V>... links) {
- for (FlowerNode<V> node : links) {
- int place = this.map.comparerison.apply(node);
- this.TryToSetSingleNode(this, node, place);
- }
- }
- }
-
- static class Functions {
-
- public static <V> Function<FlowerNode<V>, Integer> HashBasedFunction() {
- return function -> function.hashCode() % function.map.petals;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java
deleted file mode 100644
index 6ead05ce96..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.bartworks.util.log;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.logging.FileHandler;
-import java.util.logging.Formatter;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import cpw.mods.fml.common.event.FMLPreInitializationEvent;
-
-public class DebugLog {
-
- private static boolean init;
- static FileHandler fh;
- private static Logger utilLog;
-
- public static void initDebugLog(FMLPreInitializationEvent event) throws IOException {
- if (DebugLog.init) return;
- DebugLog.fh = new FileHandler(
- new File(
- new File(
- event.getModConfigurationDirectory()
- .getParentFile(),
- "logs"),
- "BWLog.log").toString());
- DebugLog.utilLog = Logger.getLogger("DebugLog");
- DebugLog.utilLog.setUseParentHandlers(false);
- DebugLog.utilLog.addHandler(DebugLog.fh);
- Formatter formatter = new Formatter() {
-
- @Override
- public String format(LogRecord record) {
- SimpleDateFormat logTime = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
- Calendar cal = new GregorianCalendar();
- cal.setTimeInMillis(record.getMillis());
- return "Level: " + record
- .getLevel() + " at " + logTime.format(cal.getTime()) + " " + record.getMessage() + "\n";
- }
- };
- DebugLog.fh.setFormatter(formatter);
- DebugLog.init = true;
- }
-
- public static void log(String record) {
- if (!DebugLog.init) return;
- DebugLog.utilLog.info(record);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java
deleted file mode 100644
index 8d9d539524..0000000000
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-@API(owner = Mods.Names.BART_WORKS, apiVersion = API_REFERENCE.VERSION, provides = "bartworks util")
-package com.github.bartimaeusnek.bartworks.util;
-
-import com.github.bartimaeusnek.bartworks.API.API_REFERENCE;
-
-import cpw.mods.fml.common.API;
-import gregtech.api.enums.Mods;
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java b/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java
deleted file mode 100644
index b1264fb9af..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod;
-
-import static gregtech.api.enums.Mods.GTPlusPlus;
-import static gregtech.api.enums.Mods.GalacticraftCore;
-import static gregtech.api.enums.Mods.TecTech;
-
-import java.io.StringReader;
-
-import net.minecraft.util.StringTranslate;
-
-import org.apache.commons.io.input.ReaderInputStream;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import com.github.bartimaeusnek.bartworks.API.API_REFERENCE;
-import com.github.bartimaeusnek.crossmod.GTpp.loader.RadioHatchCompat;
-import com.github.bartimaeusnek.crossmod.galacticraft.GalacticraftProxy;
-import com.github.bartimaeusnek.crossmod.tectech.TecTechResearchLoader;
-
-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 cpw.mods.fml.common.event.FMLServerStartingEvent;
-
-@Mod(
- modid = BartWorksCrossmod.MOD_ID,
- name = BartWorksCrossmod.NAME,
- version = BartWorksCrossmod.VERSION,
- dependencies = """
- required-after:IC2;\
- required-after:gregtech;\
- required-after:bartworks;\
- after:GalacticraftMars;\
- after:GalacticraftCore;\
- after:Micdoodlecore;\
- after:miscutils;\
- after:EMT;\
- after:tectech;""")
-public class BartWorksCrossmod {
-
- public static final String NAME = "BartWorks Mod Additions";
- public static final String VERSION = API_REFERENCE.VERSION;
- public static final String MOD_ID = "bartworkscrossmod";
- public static final Logger LOGGER = LogManager.getLogger(BartWorksCrossmod.NAME);
-
- @Mod.Instance(BartWorksCrossmod.MOD_ID)
- public static BartWorksCrossmod instance;
-
- @Mod.EventHandler
- public void preInit(FMLPreInitializationEvent preinit) {
- if (GalacticraftCore.isModLoaded()) {
- GalacticraftProxy.preInit(preinit);
- }
- }
-
- @Mod.EventHandler
- public void init(FMLInitializationEvent init) {
- if (GalacticraftCore.isModLoaded()) {
- GalacticraftProxy.init(init);
- }
- }
-
- @Mod.EventHandler
- public void postInit(FMLPostInitializationEvent init) {
- if (GalacticraftCore.isModLoaded()) {
- GalacticraftProxy.postInit(init);
- }
- if (GTPlusPlus.isModLoaded()) {
- RadioHatchCompat.run();
- }
- if (TecTech.isModLoaded()) {
- TecTechResearchLoader.runResearches();
- }
- }
-
- @Mod.EventHandler
- public void onFMLServerStart(FMLServerStartingEvent event) {
- if (GTPlusPlus.isModLoaded()) {
- for (Object s : RadioHatchCompat.TranslateSet) {
- StringTranslate.inject(new ReaderInputStream(new StringReader((String) s)));
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java b/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java
deleted file mode 100644
index b8fcdb9135..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.GTpp.loader;
-
-import static gregtech.api.enums.Mods.GTPlusPlus;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.RegistryNamespaced;
-import net.minecraftforge.oredict.OreDictionary;
-
-import com.github.bartimaeusnek.bartworks.API.IRadMaterial;
-import com.github.bartimaeusnek.bartworks.util.log.DebugLog;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-
-import cpw.mods.fml.common.Loader;
-import cpw.mods.fml.common.ModContainer;
-import cpw.mods.fml.common.registry.GameData;
-import cpw.mods.fml.common.registry.GameRegistry;
-
-public class RadioHatchCompat {
-
- private static Class<?> intf;
- private static Class<?> materialClass;
- private static Class<?> enu;
- private static Class<?> materialStackClass;
-
- private static Field isRadioactive;
- private static Field f;
- private static Field componentType;
- private static Field radlevel;
- private static Field protons;
-
- private static Field vMaterialInput;
- private static Field stackMaterial;
- private static Field RGBA;
- private static Field localizedName;
- private static Field unlocalizedName;
-
- private static Object rod;
- private static Object longRod;
-
- public static HashSet<String> TranslateSet = new HashSet<>();
-
- static {
- try {
- RadioHatchCompat.intf = Class.forName("gtPlusPlus.core.item.base.BaseItemComponent");
- RadioHatchCompat.enu = Class.forName("gtPlusPlus.core.item.base.BaseItemComponent$ComponentTypes");
- RadioHatchCompat.materialClass = Class.forName("gtPlusPlus.core.material.Material");
- RadioHatchCompat.materialStackClass = Class.forName("gtPlusPlus.core.material.MaterialStack");
-
- RadioHatchCompat.f = RadioHatchCompat.intf.getField("componentMaterial");
- RadioHatchCompat.isRadioactive = RadioHatchCompat.materialClass.getField("isRadioactive");
- RadioHatchCompat.componentType = RadioHatchCompat.intf.getDeclaredField("componentType");
- RadioHatchCompat.radlevel = RadioHatchCompat.materialClass.getField("vRadiationLevel");
-
- RadioHatchCompat.vMaterialInput = RadioHatchCompat.materialClass.getDeclaredField("vMaterialInput");
- RadioHatchCompat.stackMaterial = RadioHatchCompat.materialStackClass.getDeclaredField("stackMaterial");
- RadioHatchCompat.protons = RadioHatchCompat.materialClass.getDeclaredField("vProtons");
- RadioHatchCompat.RGBA = RadioHatchCompat.materialClass.getDeclaredField("RGBA");
- RadioHatchCompat.localizedName = RadioHatchCompat.materialClass.getDeclaredField("localizedName");
- RadioHatchCompat.unlocalizedName = RadioHatchCompat.materialClass.getDeclaredField("unlocalizedName");
-
- RadioHatchCompat.vMaterialInput.setAccessible(true);
- RadioHatchCompat.stackMaterial.setAccessible(true);
- RadioHatchCompat.protons.setAccessible(true);
- RadioHatchCompat.RGBA.setAccessible(true);
- RadioHatchCompat.localizedName.setAccessible(true);
- RadioHatchCompat.unlocalizedName.setAccessible(true);
-
- Object[] arr = RadioHatchCompat.enu.getEnumConstants();
- for (Object o : arr) {
- if (RadioHatchCompat.rod != null && RadioHatchCompat.longRod != null) break;
- if ("ROD".equalsIgnoreCase(o.toString())) RadioHatchCompat.rod = o;
- else if ("RODLONG".equalsIgnoreCase(o.toString())) RadioHatchCompat.longRod = o;
- }
-
- } catch (NoSuchFieldException | ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- @SuppressWarnings("unchecked")
- public static void run() {
- DebugLog.log("Starting Generation of missing GT++ rods/longrods");
- try {
- Class<? extends Item> rodclass = (Class<? extends Item>) Class
- .forName("gtPlusPlus.core.item.base.rods.BaseItemRod");
- Class<? extends Item> longrodclass = (Class<? extends Item>) Class
- .forName("gtPlusPlus.core.item.base.rods.BaseItemRodLong");
- Constructor<? extends Item> c1 = rodclass.getConstructor(RadioHatchCompat.materialClass);
- Constructor<? extends Item> c2 = longrodclass.getConstructor(RadioHatchCompat.materialClass);
- Field cOwners = GameData.class.getDeclaredField("customOwners");
- cOwners.setAccessible(true);
- Field map = RegistryNamespaced.class.getDeclaredField("field_148758_b");
- map.setAccessible(true);
- Map<Item, String> UniqueIdentifierMap = (Map<Item, String>) map.get(GameData.getItemRegistry());
-
- Map<GameRegistry.UniqueIdentifier, ModContainer> ownerItems = (Map<GameRegistry.UniqueIdentifier, ModContainer>) cOwners
- .get(null);
- ModContainer gtpp = null;
- ModContainer bartworks = null;
-
- for (ModContainer container : Loader.instance()
- .getModList()) {
- if (gtpp != null && bartworks != null) break;
- if (BartWorksCrossmod.MOD_ID.equalsIgnoreCase(container.getModId())) bartworks = container;
- else if (container.getModId()
- .equalsIgnoreCase(GTPlusPlus.ID)) gtpp = container;
- }
-
- for (Object mats : (Set<?>) RadioHatchCompat.materialClass.getField("mMaterialMap")
- .get(null)) {
- if (RadioHatchCompat.isRadioactive.getBoolean(mats)) {
-
- if (OreDictionary.getOres("stick" + RadioHatchCompat.unlocalizedName.get(mats))
- .isEmpty()) {
- Item it = c1.newInstance(mats);
- UniqueIdentifierMap.replace(it, "miscutils:" + it.getUnlocalizedName());
- GameRegistry.UniqueIdentifier ui = GameRegistry.findUniqueIdentifierFor(it);
- ownerItems.replace(ui, bartworks, gtpp);
-
- String tanslate = it.getUnlocalizedName() + ".name="
- + RadioHatchCompat.localizedName.get(mats)
- + " Rod";
- RadioHatchCompat.TranslateSet.add(tanslate);
-
- DebugLog.log(tanslate);
- DebugLog.log("Generate: " + RadioHatchCompat.rod + RadioHatchCompat.unlocalizedName.get(mats));
- }
- if (OreDictionary.getOres("stickLong" + RadioHatchCompat.unlocalizedName.get(mats))
- .isEmpty()) {
- Item it2 = c2.newInstance(mats);
- UniqueIdentifierMap.replace(it2, "miscutils:" + it2.getUnlocalizedName());
- GameRegistry.UniqueIdentifier ui2 = GameRegistry.findUniqueIdentifierFor(it2);
- ownerItems.replace(ui2, bartworks, gtpp);
-
- DebugLog
- .log("Generate: " + RadioHatchCompat.longRod + RadioHatchCompat.unlocalizedName.get(mats));
- }
- }
- }
- } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException
- | InstantiationException | ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public static IRadMaterial GTppRadChecker(ItemStack lStack) {
- try {
- if (RadioHatchCompat.intf.isAssignableFrom(
- lStack.getItem()
- .getClass())) {
- if (!RadioHatchCompat.isRadioactive.getBoolean(RadioHatchCompat.f.get(lStack.getItem()))) return null;
- int amount = RadioHatchCompat.componentType.get(lStack.getItem())
- .equals(RadioHatchCompat.rod) ? 1
- : RadioHatchCompat.componentType.get(lStack.getItem())
- .equals(RadioHatchCompat.longRod) ? 2 : 0;
- if (amount == 0) return null;
- return new RadioHatchCompat.GTPPRadAdapter(amount, RadioHatchCompat.f.get(lStack.getItem()));
- }
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- static class GTPPRadAdapter implements IRadMaterial {
-
- static final HashMap<Object, Integer> BUFFER = new HashMap<>();
-
- GTPPRadAdapter(Object m) {
- this.m = m;
- }
-
- GTPPRadAdapter(int amount, Object m) {
- this.amount = (byte) amount;
- this.m = m;
- }
-
- byte amount;
- final Object m;
-
- private static ArrayList<?> getMaterialInput(Object GTPPMaterial) throws IllegalAccessException {
- Object ret = RadioHatchCompat.vMaterialInput.get(GTPPMaterial);
- return ret instanceof ArrayList ? (ArrayList<?>) ret : new ArrayList<>();
- }
-
- private static boolean isElement(Object GTPPMaterial) throws IllegalAccessException {
- return RadioHatchCompat.GTPPRadAdapter.getMaterialInput(GTPPMaterial)
- .isEmpty();
- }
-
- private static List<?> getElemets(Object GTPPMaterial) throws IllegalAccessException {
- ArrayList<Object> elements = new ArrayList<>();
- Queue<Object> toCheck = new LinkedList<>();
- ArrayList<?> materialInputs = RadioHatchCompat.GTPPRadAdapter.getMaterialInput(GTPPMaterial);
- if (materialInputs.isEmpty()) return Collections.singletonList(GTPPMaterial);
- for (Object materialStack : materialInputs) {
- if (!RadioHatchCompat.GTPPRadAdapter.isElement(RadioHatchCompat.stackMaterial.get(materialStack)))
- toCheck.add(RadioHatchCompat.stackMaterial.get(materialStack));
- else elements.add(RadioHatchCompat.stackMaterial.get(materialStack));
- }
- while (!toCheck.isEmpty()) {
- elements.addAll(GTPPRadAdapter.getElemets(toCheck.poll()));
- }
- return elements;
- }
-
- private static Integer calulateRad(Object m) {
- int ret = 0;
- try {
- List<?> pureElements = RadioHatchCompat.GTPPRadAdapter.getElemets(m);
- for (Object materialObj : pureElements) if (RadioHatchCompat.isRadioactive.getBoolean(materialObj))
- ret += RadioHatchCompat.radlevel.getByte(m)
- + RadioHatchCompat.GTPPRadAdapter.clampToZero(RadioHatchCompat.protons.getLong(materialObj));
- else ret += RadioHatchCompat.radlevel.getByte(m);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return ret;
- }
-
- @Override
- public int getRadiationLevel(ItemStack aStack) {
- return RadioHatchCompat.GTPPRadAdapter.BUFFER
- .computeIfAbsent(this.m, radlvl -> RadioHatchCompat.GTPPRadAdapter.calulateRad(this.m));
- }
-
- private static long clampToZero(long number) {
- return number > 0 ? number : 0;
- }
-
- @Override
- public byte getAmountOfMaterial(ItemStack aStack) {
- return this.amount;
- }
-
- @Override
- public short[] getColorForGUI(ItemStack aStack) {
- short[] rgba = { 0, 0, 0, 0 };
- try {
- rgba = (short[]) RadioHatchCompat.RGBA.get(this.m);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return rgba;
- }
-
- @Override
- public String getNameForGUI(ItemStack aStack) {
- String ret = "";
- try {
- ret = (String) RadioHatchCompat.localizedName.get(this.m);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return ret;
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java b/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java
deleted file mode 100644
index adb3d42754..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.cls;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Optional;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-
-@SuppressWarnings({ "rawtypes", "unchecked" })
-public class CLSCompat {
-
- private CLSCompat() {}
-
- private static final long MINIMAL_UPDATE_INTERVAL = 1000 / 30; // target 30 fps
- private static long lastUpdate = 0;
- private static Class alexiilMinecraftDisplayer;
- private static Class alexiilProgressDisplayer;
- private static Method displayProgress;
- private static Field isRegisteringBartWorks;
-
- static {
- try {
- alexiilMinecraftDisplayer = Class.forName("alexiil.mods.load.MinecraftDisplayer");
- alexiilProgressDisplayer = Class.forName("alexiil.mods.load.ProgressDisplayer");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
-
- Optional.ofNullable(alexiilMinecraftDisplayer)
- .ifPresent(e -> {
- try {
- isRegisteringBartWorks = e.getField("isRegisteringBartWorks");
- } catch (NoSuchFieldException ex) {
- ex.printStackTrace();
- }
- });
-
- Optional.ofNullable(alexiilProgressDisplayer)
- .ifPresent(e -> {
- try {
- displayProgress = e.getMethod("displayProgress", String.class, float.class);
- } catch (NoSuchMethodException ex) {
- ex.printStackTrace();
- }
- });
- }
-
- public static Integer[] initCls() {
- int sizeStep;
- int sizeStep2 = 1;
-
- try {
- isRegisteringBartWorks.set(null, true);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
-
- if (Werkstoff.werkstoffHashSet.size() >= 100) sizeStep = Werkstoff.werkstoffHashSet.size() / 100 - 1;
- else sizeStep = sizeStep2 = Werkstoff.werkstoffHashSet.size();
-
- return new Integer[] { sizeStep, sizeStep2, sizeStep };
- }
-
- public static int invokeStepSize(Werkstoff werkstoff, Integer[] steps, int size) {
- --steps[0];
-
- long time = System.currentTimeMillis();
- if (time - lastUpdate >= MINIMAL_UPDATE_INTERVAL) {
- try {
- displayProgress.invoke(null, werkstoff.getDefaultName(), (float) size / 10000);
- } catch (IllegalAccessException | InvocationTargetException e) {
- e.printStackTrace();
- }
- lastUpdate = time;
- }
-
- if (steps[0] == 0 && Werkstoff.werkstoffHashSet.size() >= 100) steps[0] = steps[2];
-
- size += steps[1];
- return size;
- }
-
- public static void disableCls() {
- try {
- isRegisteringBartWorks.set(null, false);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java
deleted file mode 100644
index da9bd49397..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticgreg;
-
-import static com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference.MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS;
-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.VN;
-
-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.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.world.gen.ChunkProviderServer;
-import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.google.common.collect.ImmutableList;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.interfaces.IHatchElement;
-import gregtech.api.objects.XSTR;
-import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
-import gregtech.api.util.GT_Utility;
-import gregtech.api.util.shutdown.ShutDownReasonRegistry;
-import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DrillerBase;
-
-public abstract class GT_TileEntity_VoidMiner_Base extends GT_MetaTileEntity_DrillerBase {
-
- private VoidMinerUtility.DropMap dropMap = null;
- private VoidMinerUtility.DropMap extraDropMap = null;
- private float totalWeight;
- private int multiplier = 1;
-
- protected final byte TIER_MULTIPLIER;
-
- private boolean mBlacklist = false;
-
- /**
- * @Deprecated Use {@link VoidMinerUtility#addBlockToDimensionList}
- */
- @Deprecated
- public static void addBlockToDimensionList(int dimId, Block block, int meta, float weight) {
- VoidMinerUtility.addBlockToDimensionList(dimId, block, meta, weight);
- }
-
- public GT_TileEntity_VoidMiner_Base(int aID, String aName, String aNameRegional, int tier) {
- super(aID, aName, aNameRegional);
- this.TIER_MULTIPLIER = (byte) Math.max(tier, 1);
- }
-
- @Override
- public void saveNBTData(NBTTagCompound aNBT) {
- super.saveNBTData(aNBT);
- aNBT.setBoolean("mBlacklist", this.mBlacklist);
- }
-
- @Override
- public void loadNBTData(NBTTagCompound aNBT) {
- super.loadNBTData(aNBT);
- this.mBlacklist = aNBT.getBoolean("mBlacklist");
- }
-
- public GT_TileEntity_VoidMiner_Base(String aName, int tier) {
- super(aName);
- this.TIER_MULTIPLIER = (byte) tier;
- }
-
- @Override
- protected int getMinTier() {
- return this.TIER_MULTIPLIER + 5; // min tier = LuV
- }
-
- @Override
- protected boolean checkHatches() {
- return true;
- }
-
- @Override
- protected void setElectricityStats() {
- try {
- this.mEUt = this.isPickingPipes ? 60 : Math.toIntExact(GT_Values.V[this.getMinTier()]);
- } catch (ArithmeticException e) {
- e.printStackTrace();
- this.mEUt = Integer.MAX_VALUE - 7;
- }
- this.mOutputItems = new ItemStack[0];
- this.mProgresstime = 0;
- this.mMaxProgresstime = 10;
- this.mEfficiency = this.getCurrentEfficiency(null);
- this.mEfficiencyIncrease = 10000;
- this.mEUt = this.mEUt > 0 ? -this.mEUt : this.mEUt;
- }
-
- @Override
- protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
- int yHead, int oldYHead) {
- // if the dropMap has never been initialised or if the dropMap is empty
- if (this.dropMap == null || this.totalWeight == 0) this.calculateDropMap();
-
- if (this.totalWeight != 0.f) {
- this.handleFluidConsumption();
- this.handleOutputs();
- return true;
- } else {
- this.stopMachine(ShutDownReasonRegistry.NONE);
- return false;
- }
- }
-
- @Override
- protected GT_Multiblock_Tooltip_Builder createTooltip() {
- String casings = this.getCasingBlockItem()
- .get(0)
- .getDisplayName();
-
- final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Miner")
- .addInfo("Controller Block for the Void Miner " + GT_Values.VN[this.getMinTier()])
- .addInfo("Consumes " + GT_Values.V[this.getMinTier()] + "EU/t")
- .addInfo(
- "Can be supplied with 2L/s of Neon(x4), Krypton(x8), Xenon(x16) or Oganesson(x64) for higher outputs.")
- .addInfo(
- "Will output " + 2 * this.TIER_MULTIPLIER
- + " Ores per Second depending on the Dimension it is build in")
- .addInfo("Put the Ore into the input bus to set the Whitelist/Blacklist")
- .addInfo("Use a screwdriver to toggle Whitelist/Blacklist")
- .addInfo("Blacklist or non Whitelist Ore will be VOIDED")
- .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(
- this.getFrameMaterial().mName + " Frame Boxes",
- "Each pillar's side and 1x3x1 on top")
- .addEnergyHatch(VN[this.getMinTier()] + "+, Any base casing")
- .addMaintenanceHatch("Any base casing")
- .addInputBus("Mining Pipes or Ores, optional, any base casing")
- .addInputHatch("Optional noble gas, any base casing")
- .addOutputBus("Any base casing")
- .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS);
- return tt;
- }
-
- @Override
- protected List<IHatchElement<? super GT_MetaTileEntity_DrillerBase>> getAllowedHatches() {
- return ImmutableList.of(InputHatch, InputBus, OutputBus, Maintenance, Energy);
- }
-
- /**
- * method used to pick the next ore in the dropMap.
- *
- * @return the chosen ore
- */
- private ItemStack nextOre() {
- float currentWeight = 0.f;
- while (true) {
- float randomNumber = XSTR.XSTR_INSTANCE.nextFloat() * this.totalWeight;
- for (Map.Entry<GT_Utility.ItemId, Float> entry : this.dropMap.getInternalMap()
- .entrySet()) {
- currentWeight += entry.getValue();
- if (randomNumber < currentWeight) return entry.getKey()
- .getItemStack();
- }
- for (Map.Entry<GT_Utility.ItemId, Float> entry : this.extraDropMap.getInternalMap()
- .entrySet()) {
- currentWeight += entry.getValue();
- if (randomNumber < currentWeight) return entry.getKey()
- .getItemStack();
- }
- }
- }
-
- /**
- * Method used to check the current gat and its corresponding multiplier
- *
- * @return the noble gas in the hatch. returns null if there is no noble gas found.
- */
- private FluidStack getNobleGasInputAndSetMultiplier() {
- for (FluidStack s : this.getStoredFluids()) {
- for (int i = 0; i < VoidMinerUtility.NOBLE_GASSES.length; i++) {
- FluidStack ng = VoidMinerUtility.NOBLE_GASSES[i];
- if (ng.isFluidEqual(s)) {
- this.multiplier = this.TIER_MULTIPLIER * VoidMinerUtility.NOBEL_GASSES_MULTIPLIER[i];
- return s;
- }
- }
- }
- return null;
- }
-
- /**
- * method used to decrement the quantity of gas in the hatch
- *
- * @param gasToConsume the fluid stack in the hatch
- * @return if yes or no it was able to decrement the quantity of the fluidStack
- */
- private boolean consumeNobleGas(FluidStack gasToConsume) {
- for (FluidStack s : this.getStoredFluids()) {
- if (s.isFluidEqual(gasToConsume) && s.amount >= 1) {
- s.amount -= 1;
- this.updateSlots();
- return true;
- }
- }
- return false;
- }
-
- /**
- * handler for the fluid consumption
- */
- private void handleFluidConsumption() {
- FluidStack storedNobleGas = this.getNobleGasInputAndSetMultiplier();
- if (storedNobleGas == null || !this.consumeNobleGas(storedNobleGas)) this.multiplier = this.TIER_MULTIPLIER;
- }
-
- /**
- * Handles the ores added manually with {@link VoidMinerUtility#addMaterialToDimensionList}
- *
- * @param id the specified dim id
- */
- private void handleExtraDrops(int id) {
- if (VoidMinerUtility.extraDropsDimMap.containsKey(id)) {
- extraDropMap = VoidMinerUtility.extraDropsDimMap.get(id);
- }
- }
-
- /**
- * Gets the DropMap of the dim for the specified dim id
- *
- * @param id the dim number
- */
- private void handleModDimDef(int id) {
- if (VoidMinerUtility.dropMapsByDimId.containsKey(id)) {
- this.dropMap = VoidMinerUtility.dropMapsByDimId.get(id);
- } else {
- String chunkProviderName = ((ChunkProviderServer) this.getBaseMetaTileEntity()
- .getWorld()
- .getChunkProvider()).currentChunkProvider.getClass()
- .getName();
-
- if (VoidMinerUtility.dropMapsByChunkProviderName.containsKey(chunkProviderName)) {
- this.dropMap = VoidMinerUtility.dropMapsByChunkProviderName.get(chunkProviderName);
- }
- }
- }
-
- /**
- * Computes first the ores related to the dim the VM is in, then the ores added manually, then it computes the
- * totalWeight for normalisation
- */
- private void calculateDropMap() {
- this.dropMap = new VoidMinerUtility.DropMap();
- this.extraDropMap = new VoidMinerUtility.DropMap();
- int id = this.getBaseMetaTileEntity()
- .getWorld().provider.dimensionId;
- this.handleModDimDef(id);
- this.handleExtraDrops(id);
- this.totalWeight = dropMap.getTotalWeight() + extraDropMap.getTotalWeight();
- }
-
- /**
- * Output logic of the VM
- */
- private void handleOutputs() {
- final List<ItemStack> inputOres = this.getStoredInputs()
- .stream()
- .filter(GT_Utility::isOre)
- .collect(Collectors.toList());;
- final ItemStack output = this.nextOre();
- output.stackSize = multiplier;
- if (inputOres.size() == 0 || this.mBlacklist && inputOres.stream()
- .noneMatch(is -> GT_Utility.areStacksEqual(is, output))
- || !this.mBlacklist && inputOres.stream()
- .anyMatch(is -> GT_Utility.areStacksEqual(is, output)))
- this.addOutput(output);
- this.updateSlots();
- }
-
- @Override
- public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- this.mBlacklist = !this.mBlacklist;
- GT_Utility.sendChatToPlayer(aPlayer, "Mode: " + (this.mBlacklist ? "Blacklist" : "Whitelist"));
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java
deleted file mode 100644
index 5f15bd6c09..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticgreg;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-
-public class GT_TileEntity_VoidMiners {
-
- public static class VMLUV extends GT_TileEntity_VoidMiner_Base {
-
- public VMLUV(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 1);
- }
-
- public VMLUV(String aName, int tier) {
- super(aName, tier);
- }
-
- @Override
- protected ItemList getCasingBlockItem() {
- return ItemList.Casing_UV;
- }
-
- @Override
- protected Materials getFrameMaterial() {
- return Materials.Europium;
- }
-
- @Override
- protected int getCasingTextureIndex() {
- return 8;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new VMLUV(this.mName, this.TIER_MULTIPLIER);
- }
- }
-
- public static class VMZPM extends GT_TileEntity_VoidMiner_Base {
-
- public VMZPM(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 2);
- }
-
- public VMZPM(String aName, int tier) {
- super(aName, tier);
- }
-
- @Override
- protected ItemList getCasingBlockItem() {
- return ItemList.Casing_MiningBlackPlutonium;
- }
-
- @Override
- protected Materials getFrameMaterial() {
- return Materials.BlackPlutonium;
- }
-
- @Override
- protected int getCasingTextureIndex() {
- return 179;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new VMZPM(this.mName, this.TIER_MULTIPLIER);
- }
- }
-
- public static class VMUV extends GT_TileEntity_VoidMiner_Base {
-
- public VMUV(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 3);
- }
-
- public VMUV(String aName, int tier) {
- super(aName, tier);
- }
-
- @Override
- protected ItemList getCasingBlockItem() {
- return ItemList.Casing_MiningNeutronium;
- }
-
- @Override
- protected Materials getFrameMaterial() {
- return Materials.Neutronium;
- }
-
- @Override
- protected int getCasingTextureIndex() {
- return 178;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new VMUV(this.mName, this.TIER_MULTIPLIER);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java
deleted file mode 100644
index 5254da24f1..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java
+++ /dev/null
@@ -1,316 +0,0 @@
-package com.github.bartimaeusnek.crossmod.galacticgreg;
-
-import static bloodasp.galacticgreg.registry.GalacticGregRegistry.getModContainers;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Items;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_OreLayer;
-
-import bloodasp.galacticgreg.GT_Worldgen_GT_Ore_Layer_Space;
-import bloodasp.galacticgreg.GT_Worldgen_GT_Ore_SmallPieces_Space;
-import bloodasp.galacticgreg.GalacticGreg;
-import bloodasp.galacticgreg.api.ModContainer;
-import bloodasp.galacticgreg.api.ModDimensionDef;
-import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_Layer_Space;
-import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_SmallOre_Space;
-import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.Materials;
-import gregtech.api.interfaces.ISubTagContainer;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Worldgen_GT_Ore_Layer;
-import gregtech.common.GT_Worldgen_GT_Ore_SmallPieces;
-
-public class VoidMinerUtility {
-
- public static final FluidStack[] NOBLE_GASSES = { WerkstoffLoader.Neon.getFluidOrGas(1),
- WerkstoffLoader.Krypton.getFluidOrGas(1), WerkstoffLoader.Xenon.getFluidOrGas(1),
- WerkstoffLoader.Oganesson.getFluidOrGas(1) };
- public static final int[] NOBEL_GASSES_MULTIPLIER = { 4, 8, 16, 64 };
-
- public static class DropMap {
-
- private float totalWeight;
- private final Map<GT_Utility.ItemId, Float> internalMap;
-
- public DropMap() {
- internalMap = new HashMap<>();
- totalWeight = 0;
- }
-
- /**
- * Method used to add an ore to the DropMap
- *
- * @param weight the non normalised weight
- * @param isBWOres true for BW ores, false for GT ores
- */
- public void addDrop(int meta, float weight, boolean isBWOres) {
- if (isBWOres) {
- addDrop(WerkstoffLoader.BWOres, meta, weight);
- } else {
- addDrop(GregTech_API.sBlockOres1, meta, weight);
- }
- }
-
- /**
- * Method used to add any item to the DropMap. Will be blocked if blacklisted.
- *
- * @param weight the non normalised weight
- */
- public void addDrop(Block block, int meta, float weight) {
- if (ConfigHandler.voidMinerBlacklist.contains(
- String.format(
- "%s:%d",
- GameRegistry.findUniqueIdentifierFor(block)
- .toString(),
- meta)))
- return;
- Item item = Item.getItemFromBlock(block);
- addDrop(item, meta, weight);
- }
-
- /**
- * Method used to add any item to the DropMap. Will be blocked if blacklisted.
- *
- * @param weight the non normalised weight
- */
- public void addDrop(ItemStack itemStack, float weight) {
- Item item = itemStack.getItem();
- int meta = Items.feather.getDamage(itemStack);
- if (ConfigHandler.voidMinerBlacklist.contains(
- String.format(
- "%s:%d",
- GameRegistry.findUniqueIdentifierFor(Block.getBlockFromItem(item))
- .toString(),
- meta)))
- return;
- addDrop(item, meta, weight);
- }
-
- private void addDrop(Item item, int meta, float weight) {
- GT_Utility.ItemId ore = GT_Utility.ItemId.createNoCopy(item, meta, null);
- internalMap.merge(ore, weight, Float::sum);
- totalWeight += weight;
- }
-
- public float getTotalWeight() {
- return totalWeight;
- }
-
- public Map<GT_Utility.ItemId, Float> getInternalMap() {
- return internalMap;
- }
- }
-
- public static final Map<Integer, DropMap> dropMapsByDimId = new HashMap<>();
- public static final Map<String, DropMap> dropMapsByChunkProviderName = new HashMap<>();
- public static final Map<Integer, DropMap> extraDropsDimMap = new HashMap<>();
-
- // Adds tellurium to OW to ensure a way to get it, as it's used in Magneto Resonatic
- // Dust and Circuit Compound MK3 Dust
- static {
- addMaterialToDimensionList(0, Materials.Tellurium, 8.0f);
- }
-
- /**
- * Computes the ores of the dims
- */
- public static void generateDropMaps() {
- // vanilla dims
- dropMapsByDimId.put(-1, getDropMapVanilla(-1));
- dropMapsByDimId.put(0, getDropMapVanilla(0));
- dropMapsByDimId.put(1, getDropMapVanilla(1));
- // Twilight Forest
- dropMapsByDimId.put(7, getDropMapVanilla(7));
-
- // ross dims
- dropMapsByDimId.put(ConfigHandler.ross128BID, getDropMapRoss(ConfigHandler.ross128BID));
- dropMapsByDimId.put(ConfigHandler.ross128BAID, getDropMapRoss(ConfigHandler.ross128BAID));
-
- // other space dims
- for (ModContainer modContainer : getModContainers()) {
- for (ModDimensionDef dimDef : modContainer.getDimensionList()) {
- dropMapsByChunkProviderName.put(dimDef.getChunkProviderName(), getDropMapSpace(dimDef));
- }
- }
- }
-
- /**
- * Method to generate a DropMap that contains ores of a vanilla GT worldgen
- */
- private static DropMap getDropMapVanilla(int dimId) {
- DropMap dropMap = new DropMap();
-
- // Ore Veins
- Predicate<GT_Worldgen_GT_Ore_Layer> oreLayerPredicate = makeOreLayerPredicate(dimId);
- GT_Worldgen_GT_Ore_Layer.sList.stream()
- .filter(gt_worldgen -> gt_worldgen.mEnabled && oreLayerPredicate.test(gt_worldgen))
- .forEach(element -> {
- dropMap.addDrop(element.mPrimaryMeta, element.mWeight, false);
- dropMap.addDrop(element.mSecondaryMeta, element.mWeight, false);
- dropMap.addDrop(element.mSporadicMeta, element.mWeight / 8f, false);
- dropMap.addDrop(element.mBetweenMeta, element.mWeight / 8f, false);
- });
-
- // Small Ores
- Predicate<GT_Worldgen_GT_Ore_SmallPieces> smallOresPredicate = makeSmallOresPredicate(dimId);
- GT_Worldgen_GT_Ore_SmallPieces.sList.stream()
- .filter(gt_worldgen -> gt_worldgen.mEnabled && smallOresPredicate.test(gt_worldgen))
- .forEach(element -> dropMap.addDrop(element.mMeta, element.mAmount, false));
- return dropMap;
- }
-
- /**
- * Makes a predicate for the GT normal ore veins worldgen
- *
- * @return the predicate
- */
- private static Predicate<GT_Worldgen_GT_Ore_Layer> makeOreLayerPredicate(int dimensionId) {
- return switch (dimensionId) {
- case -1 -> gt_worldgen -> gt_worldgen.mNether;
- case 0 -> gt_worldgen -> gt_worldgen.mOverworld;
- case 1 -> gt_worldgen -> gt_worldgen.mEnd || gt_worldgen.mEndAsteroid;
- /*
- * explicitly giving different dim numbers so that it default to false in the config, keeping compat with
- * the current worldgen config
- */
- case 7 -> gt_worldgen -> gt_worldgen.isGenerationAllowed("Twilight Forest", 0, 7);
- default -> throw new IllegalStateException();
- };
- }
-
- /**
- * Makes a predicate for the GT normal small ore worldgen
- *
- * @return the predicate
- */
- private static Predicate<GT_Worldgen_GT_Ore_SmallPieces> makeSmallOresPredicate(int dimensionId) {
- return switch (dimensionId) {
- case -1 -> gt_worldgen -> gt_worldgen.mNether;
- case 0 -> gt_worldgen -> gt_worldgen.mOverworld;
- case 1 -> gt_worldgen -> gt_worldgen.mEnd;
- /*
- * explicitly giving different dim numbers so that it default to false in the config, keeping compat with
- * the current worldgen config
- */
- case 7 -> gt_worldgen -> gt_worldgen.isGenerationAllowed("Twilight Forest", 0, 7);
- default -> throw new IllegalStateException();
- };
- }
-
- /**
- * Create a DropMap that contains ores of Ross dims
- *
- * @param aID dim id of Ross128b or Ross128ba
- */
- private static DropMap getDropMapRoss(int aID) {
- DropMap dropMap = new DropMap();
- for (BW_OreLayer oreLayer : BW_OreLayer.sList) {
- if (oreLayer.mEnabled && oreLayer.isGenerationAllowed("", aID, 0)) {
- List<ItemStack> data = oreLayer.getStacks();
- dropMap.addDrop(data.get(0), oreLayer.mWeight);
- dropMap.addDrop(data.get(1), oreLayer.mWeight);
- dropMap.addDrop(data.get(2), oreLayer.mWeight / 8f);
- dropMap.addDrop(data.get(3), oreLayer.mWeight / 8f);
- }
- }
- return dropMap;
- }
-
- /**
- * Create a DropMap contains the ores from the galacticGreg space worldgen corresponding to the target dim
- *
- * @param finalDef ModDimensionDef corresponding to the target dim
- */
- private static DropMap getDropMapSpace(ModDimensionDef finalDef) {
- DropMap dropMap = new DropMap();
-
- // Normal Ore Veins
- GalacticGreg.oreVeinWorldgenList.stream()
- .filter(
- gt_worldgen -> gt_worldgen.mEnabled
- && gt_worldgen instanceof GT_Worldgen_GT_Ore_Layer_Space oreLayerSpace
- && oreLayerSpace.isEnabledForDim(finalDef))
- .map(gt_worldgen -> (GT_Worldgen_GT_Ore_Layer_Space) gt_worldgen)
- .forEach(element -> {
- dropMap.addDrop(element.mPrimaryMeta, element.mWeight, false);
- dropMap.addDrop(element.mSecondaryMeta, element.mWeight, false);
- dropMap.addDrop(element.mSporadicMeta, element.mWeight / 8f, false);
- dropMap.addDrop(element.mBetweenMeta, element.mWeight / 8f, false);
- });
-
- // Normal Small Ores
- GalacticGreg.smallOreWorldgenList.stream()
- .filter(
- gt_worldgen -> gt_worldgen.mEnabled
- && gt_worldgen instanceof GT_Worldgen_GT_Ore_SmallPieces_Space oreSmallPiecesSpace
- && oreSmallPiecesSpace.isEnabledForDim(finalDef))
- .map(gt_worldgen -> (GT_Worldgen_GT_Ore_SmallPieces_Space) gt_worldgen)
- .forEach(element -> dropMap.addDrop(element.mMeta, element.mAmount, false));
-
- // BW Ore Veins
- try {
- GalacticGreg.oreVeinWorldgenList.stream()
- .filter(
- gt_worldgen -> gt_worldgen.mEnabled
- && gt_worldgen instanceof BW_Worldgen_Ore_Layer_Space oreLayerSpace
- && oreLayerSpace.isEnabledForDim(finalDef))
- .map(gt_worldgen -> (BW_Worldgen_Ore_Layer_Space) gt_worldgen)
- .forEach(oreLayer -> {
- List<ItemStack> data = oreLayer.getStacks();
- dropMap.addDrop(data.get(0), oreLayer.mWeight);
- dropMap.addDrop(data.get(1), oreLayer.mWeight);
- dropMap.addDrop(data.get(2), oreLayer.mWeight / 8f);
- dropMap.addDrop(data.get(3), oreLayer.mWeight / 8f);
- });
- } catch (NullPointerException ignored) {}
-
- // BW Small Ores
- try {
- GalacticGreg.smallOreWorldgenList.stream()
- .filter(
- gt_worldgen -> gt_worldgen.mEnabled
- && gt_worldgen instanceof BW_Worldgen_Ore_SmallOre_Space smallOreSpace
- && smallOreSpace.isEnabledForDim(finalDef))
- .map(gt_worldgen -> (BW_Worldgen_Ore_SmallOre_Space) gt_worldgen)
- .forEach(element -> dropMap.addDrop(element.mPrimaryMeta, element.mDensity, element.bwOres != 0));
- } catch (NullPointerException ignored) {}
- return dropMap;
- }
-
- public static void addBlockToDimensionList(int dimId, Block block, int meta, float weight) {
- if (!extraDropsDimMap.containsKey(dimId)) {
- extraDropsDimMap.put(dimId, new DropMap());
- }
- extraDropsDimMap.get(dimId)
- .addDrop(block, meta, weight);
- }
-
- /**
- * Public method giving other mods the ability to add manually a material with an ore version into the external
- * dropMap for a specified dim id
- *
- * @param DimensionID the dim id targeted
- * @param Material the material with an ore version
- * @param weight the non normalised version of the given weight
- */
- public static void addMaterialToDimensionList(int DimensionID, ISubTagContainer Material, float weight) {
- if (Material instanceof Materials gtMaterial) {
- addBlockToDimensionList(DimensionID, GregTech_API.sBlockOres1, gtMaterial.mMetaItemSubID, weight);
- } else if (Material instanceof Werkstoff werkstoff) {
- addBlockToDimensionList(DimensionID, WerkstoffLoader.BWOres, werkstoff.getmID(), weight);
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java
deleted file mode 100644
index 972254e2d9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft;
-
-import java.io.File;
-
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.common.config.Configuration;
-
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_WorldGenRoss128b;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_WorldGenRoss128ba;
-import com.github.bartimaeusnek.crossmod.galacticraft.atmosphere.BWAtmosphereManager;
-import com.github.bartimaeusnek.crossmod.galacticraft.solarsystems.Ross128SolarSystem;
-
-import cpw.mods.fml.common.event.FMLInitializationEvent;
-import cpw.mods.fml.common.event.FMLPostInitializationEvent;
-import cpw.mods.fml.common.event.FMLPreInitializationEvent;
-import gregtech.api.objects.GT_UO_DimensionList;
-
-public class GalacticraftProxy {
-
- public static GT_UO_DimensionList uo_dimensionList = new GT_UO_DimensionList();
- static Configuration gtConf;
-
- private GalacticraftProxy() {}
-
- public static void postInit(FMLPostInitializationEvent e) {
- if (SideReference.Side.Server || SideReference.EffectiveSide.Server) {
- GalacticraftProxy.serverPostInit(e);
- } else {
- GalacticraftProxy.clientPostInit(e);
- }
- GalacticraftProxy.commonPostInit(e);
- }
-
- public static void preInit(FMLPreInitializationEvent e) {
- if (SideReference.Side.Server || SideReference.EffectiveSide.Server) {
- GalacticraftProxy.serverpreInit(e);
- } else {
- GalacticraftProxy.clientpreInit(e);
- }
- GalacticraftProxy.commonpreInit(e);
- }
-
- private static void serverpreInit(FMLPreInitializationEvent e) {}
-
- private static void clientpreInit(FMLPreInitializationEvent e) {}
-
- private static void commonpreInit(FMLPreInitializationEvent e) {
- GalacticraftProxy.gtConf = new Configuration(
- new File(new File(e.getModConfigurationDirectory(), "GregTech"), "GregTech.cfg"));
- GalacticraftProxy.uo_dimensionList.getConfig(GalacticraftProxy.gtConf, "undergroundfluid");
- BW_WorldGenRoss128b.initundergroundFluids();
- BW_WorldGenRoss128ba.init_undergroundFluids();
- if (GalacticraftProxy.gtConf.hasChanged()) GalacticraftProxy.gtConf.save();
- BW_WorldGenRoss128b.initOres();
- BW_WorldGenRoss128ba.init_Ores();
- MinecraftForge.EVENT_BUS.register(BWAtmosphereManager.INSTANCE);
- }
-
- public static void init(FMLInitializationEvent e) {
- if (SideReference.Side.Server || SideReference.EffectiveSide.Server) {
- GalacticraftProxy.serverInit(e);
- } else {
- GalacticraftProxy.clientInit(e);
- }
- GalacticraftProxy.commonInit(e);
- }
-
- private static void serverInit(FMLInitializationEvent e) {}
-
- private static void clientInit(FMLInitializationEvent e) {}
-
- private static void commonInit(FMLInitializationEvent e) {
- if (ConfigHandler.Ross128Enabled) Ross128SolarSystem.init();
- }
-
- private static void serverPostInit(FMLPostInitializationEvent e) {}
-
- private static void clientPostInit(FMLPostInitializationEvent e) {}
-
- private static void commonPostInit(FMLPostInitializationEvent e) {}
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java
deleted file mode 100644
index c9cff6cd9e..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft;
-
-import net.minecraft.entity.player.EntityPlayerMP;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-
-import micdoodle8.mods.galacticraft.core.entities.EntityLander;
-import micdoodle8.mods.galacticraft.core.entities.EntityLanderBase;
-import micdoodle8.mods.galacticraft.planets.asteroids.entities.EntityEntryPod;
-import micdoodle8.mods.galacticraft.planets.mars.entities.EntityLandingBalloons;
-
-public class PlanetsHelperClass {
-
- public static EntityLanderBase getLanderType(EntityPlayerMP player) {
- return switch (ConfigHandler.landerType) {
- case 1 -> new EntityLander(player);
- case 2 -> new EntityLandingBalloons(player);
- default -> new EntityEntryPod(player);
- };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java
deleted file mode 100644
index b6fa575b5c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft;
-
-import static gregtech.api.enums.Mods.GalacticraftMars;
-
-import java.util.Random;
-
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.world.World;
-import net.minecraft.world.WorldServer;
-
-import micdoodle8.mods.galacticraft.api.vector.Vector3;
-import micdoodle8.mods.galacticraft.api.world.ITeleportType;
-import micdoodle8.mods.galacticraft.core.entities.EntityLander;
-import micdoodle8.mods.galacticraft.core.entities.EntityLanderBase;
-import micdoodle8.mods.galacticraft.core.entities.player.GCPlayerStats;
-
-public class UniversalTeleportType implements ITeleportType {
-
- @Override
- public boolean useParachute() {
- return false;
- }
-
- @Override
- public Vector3 getPlayerSpawnLocation(WorldServer world, EntityPlayerMP player) {
- return this.getEntitySpawnLocation(world, player);
- }
-
- @Override
- public Vector3 getEntitySpawnLocation(WorldServer world, Entity entity) {
- if (entity instanceof EntityPlayerMP) {
- GCPlayerStats stats = GCPlayerStats.get((EntityPlayerMP) entity);
- return new Vector3(stats.coordsTeleportedFromX, 500D, stats.coordsTeleportedFromZ);
- }
- return new Vector3(entity.posX, 500D, entity.posZ);
- }
-
- @Override
- public Vector3 getParaChestSpawnLocation(WorldServer world, EntityPlayerMP player, Random rand) {
- return null;
- }
-
- @Override
- public void onSpaceDimensionChanged(World newWorld, EntityPlayerMP player, boolean ridingAutoRocket) {
- if (ridingAutoRocket) return;
- if (player != null && GCPlayerStats.get(player).teleportCooldown <= 0) {
- if (player.capabilities.isFlying) {
- player.capabilities.isFlying = false;
- }
-
- EntityLanderBase elb;
- if (GalacticraftMars.isModLoaded()) elb = PlanetsHelperClass.getLanderType(player);
- else elb = new EntityLander(player);
-
- if (!newWorld.isRemote) {
- newWorld.spawnEntityInWorld(elb);
- }
- GCPlayerStats.get(player).teleportCooldown = 10;
- }
- }
-
- @Override
- public void setupAdventureSpawn(EntityPlayerMP player) {}
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java
deleted file mode 100644
index fa6d2db382..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.atmosphere;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-import com.google.common.collect.ArrayListMultimap;
-
-import cpw.mods.fml.common.eventhandler.SubscribeEvent;
-import gregtech.api.enums.Materials;
-import gregtech.api.interfaces.ISubTagContainer;
-import micdoodle8.mods.galacticraft.api.galaxies.CelestialBody;
-import micdoodle8.mods.galacticraft.api.galaxies.GalaxyRegistry;
-import micdoodle8.mods.galacticraft.api.world.IAtmosphericGas;
-
-public final class BWAtmosphereManager {
-
- private static final Map<Integer, Integer[]> COEFFICIENT_MAP = new HashMap<>();
-
- private BWAtmosphereManager() {
- BWAtmosphereManager.COEFFICIENT_MAP.put(1, new Integer[] { 100 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(2, new Integer[] { 70, 30 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(3, new Integer[] { 60, 25, 15 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(4, new Integer[] { 50, 25, 15, 10 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(5, new Integer[] { 45, 25, 15, 10, 5 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(6, new Integer[] { 45, 20, 15, 10, 5, 5 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(7, new Integer[] { 40, 20, 15, 10, 5, 5, 5 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(8, new Integer[] { 35, 20, 15, 10, 5, 5, 5, 5 });
- BWAtmosphereManager.COEFFICIENT_MAP.put(9, new Integer[] { 35, 15, 15, 10, 5, 5, 5, 5, 5 });
- }
-
- public static final BWAtmosphereManager INSTANCE = new BWAtmosphereManager();
-
- private static final ArrayListMultimap<Integer, Pair<ISubTagContainer, Integer>> gasConcentration = ArrayListMultimap
- .create();
-
- public static List<Pair<ISubTagContainer, Integer>> getGasFromWorldID(int worldID) {
- return BWAtmosphereManager.gasConcentration.get(worldID);
- }
-
- public static void removeGasFromWorld(int worldID, ISubTagContainer gas) {
- for (Pair<ISubTagContainer, Integer> pair : BWAtmosphereManager.gasConcentration.get(worldID)) {
- if (pair.getKey()
- .equals(gas)) {
- BWAtmosphereManager.gasConcentration.get(worldID)
- .remove(pair);
- return;
- }
- }
- }
-
- public static void addGasToWorld(int worldID, ISubTagContainer gas, int amount) {
- Pair<ISubTagContainer, Integer> toadd = new Pair<>(gas, amount);
- BWAtmosphereManager.gasConcentration.put(worldID, toadd);
- }
-
- public static void addGasToWorld(int worldID, Pair<ISubTagContainer, Integer> toPut) {
- BWAtmosphereManager.gasConcentration.put(worldID, toPut);
- }
-
- @SafeVarargs
- public static void addGasToWorld(int worldID, Pair<ISubTagContainer, Integer>... toPut) {
- Arrays.stream(toPut)
- .forEach(toadd -> BWAtmosphereManager.gasConcentration.put(worldID, toadd));
- }
-
- private static boolean addGCGasToWorld(int worldID, IAtmosphericGas gas, int aNumber, int aMaxNumber) {
- if (IAtmosphericGas.CO2.equals(gas)) {
- BWAtmosphereManager.addGasToWorld(
- worldID,
- Materials.CarbonDioxide,
- BWAtmosphereManager.COEFFICIENT_MAP.get(aMaxNumber)[aNumber]);
- return true;
- }
- String name = gas.toString();
- name = name.charAt(0) + name.substring(1)
- .toLowerCase(Locale.US);
- ISubTagContainer mat = Materials.get(name);
- if (mat == Materials._NULL) {
- mat = WerkstoffLoader.getWerkstoff(name);
- }
- if (mat == Werkstoff.default_null_Werkstoff) {
- return false;
- }
- BWAtmosphereManager.addGasToWorld(worldID, mat, BWAtmosphereManager.COEFFICIENT_MAP.get(aMaxNumber)[aNumber]);
- return true;
- }
-
- @SubscribeEvent
- public void gcAutoRegister(GalaxyRegistry.PlanetRegisterEvent event) {
- CelestialBody planet = GalaxyRegistry.getRegisteredPlanets()
- .get(event.planetName);
- for (int i = 0; i < planet.atmosphere.size(); i++) {
- if (!BWAtmosphereManager
- .addGCGasToWorld(planet.getDimensionID(), planet.atmosphere.get(i), i, planet.atmosphere.size()))
- BartWorksCrossmod.LOGGER.warn(
- "Unidentified Fluid (" + planet.atmosphere.get(i)
- + ") in the Atmosphere of: "
- + planet.getLocalizedName());
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java
deleted file mode 100644
index af9d9647af..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.blocks;
-
-import net.minecraft.block.material.Material;
-import net.minecraft.entity.EnumCreatureType;
-import net.minecraft.world.IBlockAccess;
-
-import com.github.bartimaeusnek.bartworks.common.blocks.BW_Blocks;
-import com.github.bartimaeusnek.crossmod.galacticraft.creativetabs.SpaceTab;
-
-public class UniversalSpaceBlocks extends BW_Blocks {
-
- public UniversalSpaceBlocks(String name, String[] texture) {
- super(name, texture, SpaceTab.getInstance(), Material.rock);
- }
-
- @Override
- public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
- return true;
- }
-
- @Override
- public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java
deleted file mode 100644
index 5d9b9c3cc1..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.creativetabs;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.item.Item;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-
-public class SpaceTab extends CreativeTabs {
-
- private static final SpaceTab instance = new SpaceTab("SpaceTab");
-
- private SpaceTab(String label) {
- super(label);
- }
-
- public static SpaceTab getInstance() {
- return SpaceTab.instance;
- }
-
- @Override
- public Item getTabIconItem() {
- return ItemRegistry.DESTRUCTOPACK;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java
deleted file mode 100644
index 61c52865cf..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.planets;
-
-import micdoodle8.mods.galacticraft.api.prefab.world.gen.WorldProviderSpace;
-import micdoodle8.mods.galacticraft.api.world.IExitHeight;
-import micdoodle8.mods.galacticraft.api.world.ISolarLevel;
-
-public abstract class AbstractWorldProviderSpace extends WorldProviderSpace implements IExitHeight, ISolarLevel {
-
- @Override
- public boolean canRainOrSnow() {
- return false;
- }
-
- @Override
- public String getDimensionName() {
- return this.getCelestialBody()
- .getLocalizedName();
- }
-
- @Override
- public boolean hasSunset() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java
deleted file mode 100644
index b477154d39..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128b;
-
-import static gregtech.api.enums.Mods.Thaumcraft;
-import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.ICE;
-import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAKE;
-
-import java.util.List;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockFalling;
-import net.minecraft.entity.EnumCreatureType;
-import net.minecraft.init.Blocks;
-import net.minecraft.world.World;
-import net.minecraft.world.biome.BiomeGenBase;
-import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry;
-import net.minecraft.world.chunk.Chunk;
-import net.minecraft.world.chunk.IChunkProvider;
-import net.minecraft.world.gen.ChunkProviderGenerate;
-import net.minecraft.world.gen.MapGenBase;
-import net.minecraft.world.gen.MapGenCaves;
-import net.minecraft.world.gen.MapGenRavine;
-import net.minecraft.world.gen.feature.WorldGenLakes;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.terraingen.PopulateChunkEvent;
-import net.minecraftforge.event.terraingen.TerrainGen;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.bartworks.system.oregen.BW_WordGenerator;
-import com.github.bartimaeusnek.bartworks.system.worldgen.MapGenRuins;
-import com.github.bartimaeusnek.crossmod.thaumcraft.util.ThaumcraftHandler;
-
-import gregtech.api.objects.XSTR;
-
-public class ChunkProviderRoss128b extends ChunkProviderGenerate {
-
- XSTR rand = new XSTR();
- private BiomeGenBase[] biomesForGeneration;
- public static final BW_WordGenerator BWOreGen = new BW_WordGenerator();
- private final World worldObj;
- private final MapGenBase caveGenerator = new MapGenCaves();
- private final MapGenBase ravineGenerator = new MapGenRavine();
- private final MapGenRuins.RuinsBase ruinsBase = new MapGenRuins.RuinsBase();
-
- public ChunkProviderRoss128b(World par1World, long seed, boolean mapFeaturesEnabled) {
- super(par1World, seed, mapFeaturesEnabled);
- this.worldObj = par1World;
- }
-
- @Override
- public List<SpawnListEntry> getPossibleCreatures(EnumCreatureType p_73155_1_, int p_73155_2_, int p_73155_3_,
- int p_73155_4_) {
- return null;
- }
-
- @Override
- public Chunk provideChunk(int p_73154_1_, int p_73154_2_) {
- this.rand.setSeed(p_73154_1_ * 341873128712L + p_73154_2_ * 132897987541L);
- Block[] ablock = new Block[65536];
- byte[] abyte = new byte[65536];
- this.func_147424_a(p_73154_1_, p_73154_2_, ablock);
- this.biomesForGeneration = this.worldObj.getWorldChunkManager()
- .loadBlockGeneratorData(this.biomesForGeneration, p_73154_1_ * 16, p_73154_2_ * 16, 16, 16);
- for (int i = 0; i < this.biomesForGeneration.length; i++) {
- BiomeGenBase biomeGenBase = this.biomesForGeneration[i];
- if (biomeGenBase.biomeID == BiomeGenBase.mushroomIsland.biomeID) {
- this.biomesForGeneration[i] = BiomeGenBase.taiga;
- } else if (biomeGenBase.biomeID == BiomeGenBase.mushroomIslandShore.biomeID) {
- this.biomesForGeneration[i] = BiomeGenBase.stoneBeach;
- }
- if (Thaumcraft.isModLoaded()) {
- if (ThaumcraftHandler.isTaintBiome(biomeGenBase.biomeID))
- this.biomesForGeneration[i] = BiomeGenBase.taiga;
- else if (ConfigHandler.disableMagicalForest
- && ThaumcraftHandler.isMagicalForestBiome(biomeGenBase.biomeID))
- this.biomesForGeneration[i] = BiomeGenBase.birchForest;
- }
- }
- this.replaceBlocksForBiome(p_73154_1_, p_73154_2_, ablock, abyte, this.biomesForGeneration);
- this.caveGenerator.func_151539_a(this, this.worldObj, p_73154_1_, p_73154_2_, ablock);
- this.ravineGenerator.func_151539_a(this, this.worldObj, p_73154_1_, p_73154_2_, ablock);
-
- Chunk chunk = new Chunk(this.worldObj, ablock, abyte, p_73154_1_, p_73154_2_);
- byte[] abyte1 = chunk.getBiomeArray();
-
- for (int k = 0; k < abyte1.length; ++k) {
- abyte1[k] = (byte) this.biomesForGeneration[k].biomeID;
- }
-
- chunk.generateSkylightMap();
- return chunk;
- }
-
- @Override
- public void populate(IChunkProvider p_73153_1_, int p_73153_2_, int p_73153_3_) {
- BlockFalling.fallInstantly = true;
- int k = p_73153_2_ * 16;
- int l = p_73153_3_ * 16;
- BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(k + 16, l + 16);
- this.rand.setSeed(this.worldObj.getSeed());
- if (p_73153_2_ % 4 == 0 || p_73153_3_ % 4 == 0) {
- long i1 = this.rand.nextLong() / 2L * 2L + 1L;
- long j1 = this.rand.nextLong() / 2L * 2L + 1L;
- this.rand.setSeed(p_73153_2_ * i1 + p_73153_3_ * j1 ^ this.worldObj.getSeed());
- }
-
- MinecraftForge.EVENT_BUS
- .post(new PopulateChunkEvent.Pre(p_73153_1_, this.worldObj, this.rand, p_73153_2_, p_73153_3_, false));
-
- int x1;
- int y1;
- int z1;
- if (biomegenbase != BiomeGenBase.desert && biomegenbase != BiomeGenBase.desertHills
- && TerrainGen.populate(p_73153_1_, this.worldObj, this.rand, p_73153_2_, p_73153_3_, false, LAKE)) {
- x1 = k + this.rand.nextInt(16) + 8;
- y1 = this.rand.nextInt(256);
- z1 = l + this.rand.nextInt(16) + 8;
- int rni = this.rand.nextInt(8);
- if (rni == 0) new WorldGenLakes(Blocks.ice).generate(this.worldObj, this.rand, x1, y1, z1);
- else if (rni == 4) new WorldGenLakes(Blocks.water).generate(this.worldObj, this.rand, x1, y1, z1);
- }
- if (biomegenbase != BiomeGenBase.ocean && biomegenbase != BiomeGenBase.deepOcean
- && biomegenbase != BiomeGenBase.river
- && biomegenbase != BiomeGenBase.frozenOcean
- && biomegenbase != BiomeGenBase.frozenRiver
- && this.rand.nextInt(ConfigHandler.ross128bRuinChance) == 0) {
- x1 = k + this.rand.nextInt(16) + 3;
- y1 = this.rand.nextInt(256);
- z1 = l + this.rand.nextInt(16) + 3;
- this.ruinsBase.generate(this.worldObj, this.rand, x1, y1, z1);
- }
-
- biomegenbase.decorate(this.worldObj, this.rand, k, l);
-
- k += 8;
- l += 8;
-
- boolean doGen = TerrainGen.populate(p_73153_1_, this.worldObj, this.rand, p_73153_2_, p_73153_3_, false, ICE);
- for (x1 = 0; doGen && x1 < 16; ++x1) {
- for (y1 = 0; y1 < 16; ++y1) {
- z1 = this.worldObj.getPrecipitationHeight(k + x1, l + y1);
-
- if (this.worldObj.isBlockFreezable(x1 + k, z1 - 1, y1 + l)) {
- this.worldObj.setBlock(x1 + k, z1 - 1, y1 + l, Blocks.ice, 0, 2);
- }
-
- if (this.worldObj.func_147478_e(x1 + k, z1, y1 + l, true)) {
- this.worldObj.setBlock(x1 + k, z1, y1 + l, Blocks.snow_layer, 0, 2);
- }
- }
- }
-
- BWOreGen.generate(this.rand, p_73153_2_, p_73153_3_, this.worldObj, this, this);
- MinecraftForge.EVENT_BUS
- .post(new PopulateChunkEvent.Post(p_73153_1_, this.worldObj, this.rand, p_73153_2_, p_73153_3_, false));
-
- BlockFalling.fallInstantly = false;
- }
-
- @Override
- public void recreateStructures(int p_82695_1_, int p_82695_2_) {}
-
- @Override
- public void replaceBlocksForBiome(int p_147422_1_, int p_147422_2_, Block[] blocks, byte[] metas,
- BiomeGenBase[] p_147422_5_) {
- super.replaceBlocksForBiome(p_147422_1_, p_147422_2_, blocks, metas, p_147422_5_);
- for (int i = 0; i < blocks.length; i++) {
- if (blocks[i] == Blocks.grass) {
- blocks[i] = Blocks.dirt;
- metas[i] = 2;
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java
deleted file mode 100644
index d5368b3f0d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128b;
-
-import net.minecraft.util.ResourceLocation;
-
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-
-public class SkyProviderRoss128b {
-
- // ASM enables this texture
- public static final ResourceLocation sunTex = new ResourceLocation(
- BartWorksCrossmod.MOD_ID + ":galacticraft/Ross128b/World/SunRoss128.png");
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java
deleted file mode 100644
index 7a0c9a743c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128b;
-
-import net.minecraft.util.MathHelper;
-import net.minecraft.util.Vec3;
-import net.minecraft.world.biome.WorldChunkManager;
-import net.minecraft.world.chunk.IChunkProvider;
-
-import com.github.bartimaeusnek.crossmod.galacticraft.planets.AbstractWorldProviderSpace;
-import com.github.bartimaeusnek.crossmod.galacticraft.solarsystems.Ross128SolarSystem;
-
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import micdoodle8.mods.galacticraft.api.galaxies.CelestialBody;
-import micdoodle8.mods.galacticraft.api.vector.Vector3;
-
-public class WorldProviderRoss128b extends AbstractWorldProviderSpace {
-
- @Override
- public boolean canRespawnHere() {
- return true;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- public Vec3 getFogColor(float cy, float noidea) {
- float angle = MathHelper.cos(cy * (float) Math.PI * 2.0F) * 2.0F + 0.5F;
-
- if (angle < 0.0F) {
- angle = 0.0F;
- }
-
- if (angle > 1.0F) {
- angle = 1.0F;
- }
-
- float red = 200 / 255f;
- float green = 80 / 255f;
- float blue = 0.0F;
- red *= angle * 0.94F + 0.06F;
- green *= angle * 0.94F + 0.06F;
- return Vec3.createVectorHelper(red, green, blue);
- }
-
- @Override
- public Vector3 getFogColor() {
- // unused
- return null;
- }
-
- @Override
- public float getSunBrightness(float par1) {
- return super.getSunBrightness(par1) * 0.975f;
- }
-
- @Override
- public float calculateCelestialAngle(long par1, float par3) {
- return super.calculateCelestialAngle(par1, par3);
- }
-
- @Override
- public Vector3 getSkyColor() {
- float red = 200 / 255f;
- float green = 120 / 255f;
- float blue = 0.0F;
- return new Vector3(red, green, blue);
- }
-
- @Override
- public long getDayLength() {
- return (long) (24000 * 9.9f);
- }
-
- @Override
- public Class<? extends IChunkProvider> getChunkProviderClass() {
- return ChunkProviderRoss128b.class;
- }
-
- @Override
- public Class<? extends WorldChunkManager> getWorldChunkManagerClass() {
- return WorldChunkManager.class;
- }
-
- @Override
- public float getGravity() {
- return -0.0035F;
- }
-
- @Override
- public double getMeteorFrequency() {
- return 0D;
- }
-
- @Override
- public double getFuelUsageMultiplier() {
- return 1.35D;
- }
-
- @Override
- public boolean canSpaceshipTierPass(int tier) {
- return Ross128SolarSystem.Ross128b.getTierRequirement() <= tier;
- }
-
- @Override
- public float getFallDamageModifier() {
- return 1.35F;
- }
-
- @Override
- public float getSoundVolReductionAmount() {
- return 1F;
- }
-
- @Override
- public float getThermalLevelModifier() {
- return 0.01f;
- }
-
- @Override
- public float getWindLevel() {
- return 1.35f;
- }
-
- @Override
- public CelestialBody getCelestialBody() {
- return Ross128SolarSystem.Ross128b;
- }
-
- @Override
- public double getYCoordinateToTeleport() {
- return 500D;
- }
-
- @Override
- public double getSolarEnergyMultiplier() {
- return 1.38D;
- }
-
- @Override
- public boolean hasBreathableAtmosphere() {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java
deleted file mode 100644
index 18a8eadd2c..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128ba;
-
-import java.util.Arrays;
-import java.util.Random;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockFalling;
-import net.minecraft.init.Blocks;
-import net.minecraft.world.World;
-import net.minecraft.world.biome.BiomeGenBase;
-import net.minecraft.world.chunk.Chunk;
-import net.minecraft.world.chunk.IChunkProvider;
-
-import com.github.bartimaeusnek.bartworks.util.NoiseUtil.BartsNoise;
-import com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128b.ChunkProviderRoss128b;
-
-import gregtech.api.objects.XSTR;
-import micdoodle8.mods.galacticraft.api.prefab.world.gen.MapGenBaseMeta;
-import micdoodle8.mods.galacticraft.core.blocks.GCBlocks;
-import micdoodle8.mods.galacticraft.core.world.gen.BiomeGenBaseMoon;
-import micdoodle8.mods.galacticraft.core.world.gen.ChunkProviderMoon;
-import micdoodle8.mods.galacticraft.core.world.gen.MapGenCavesMoon;
-
-public class ChunkProviderRoss128ba extends ChunkProviderMoon {
-
- private final XSTR rand = new XSTR();
- private final World worldObj;
- private BiomeGenBase[] biomesForGeneration;
- private final MapGenBaseMeta caveGenerator;
-
- public ChunkProviderRoss128ba(World world, long seed, boolean mapFeaturesEnabled) {
- super(world, seed, mapFeaturesEnabled);
- this.biomesForGeneration = new BiomeGenBase[] { BiomeGenBaseMoon.moonFlat };
- this.caveGenerator = new MapGenCavesMoon();
- this.worldObj = world;
- }
-
- @Override
- public Chunk provideChunk(int cx, int cz) {
- this.rand.setSeed(cx * 341873128712L + cz * 132897987541L);
- Block[] ids = new Block[65536];
- byte[] meta = new byte[65536];
- Arrays.fill(ids, Blocks.air);
- this.generateTerrain(cx, cz, ids, meta);
- this.biomesForGeneration = this.worldObj.getWorldChunkManager()
- .loadBlockGeneratorData(this.biomesForGeneration, cx * 16, cz * 16, 16, 16);
- this.createCraters(cx, cz, ids, meta);
- this.replaceBlocksForBiome(cx, cz, ids, meta, this.biomesForGeneration);
- this.caveGenerator.generate(this, this.worldObj, cx, cz, ids, meta);
- Chunk Chunk = new Chunk(this.worldObj, ids, meta, cx, cz);
- Chunk.generateSkylightMap();
- return Chunk;
- }
-
- @Override
- public void decoratePlanet(World par1World, Random par2Random, int par3, int par4) {}
-
- @Override
- public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) {
- super.populate(par1IChunkProvider, par2, par3);
- BlockFalling.fallInstantly = true;
- ChunkProviderRoss128b.BWOreGen.generate(this.rand, par2, par3, this.worldObj, this, this);
- BlockFalling.fallInstantly = false;
- }
-
- private int getIndex(int x, int y, int z) {
- return (x * 16 + z) * 256 + y;
- }
-
- final Block lowerBlockID = GCBlocks.blockMoon;
- final BartsNoise noiseGen = new BartsNoise(2, 0.008F, 1D, System.nanoTime());
- final BartsNoise noiseGen2 = new BartsNoise(2, 0.01F, 1D, System.nanoTime());
- final BartsNoise noiseGen3 = new BartsNoise(2, 0.002F, 1D, System.nanoTime());
-
- @Override
- public void generateTerrain(int chunkX, int chunkZ, Block[] idArray, byte[] metaArray) {
- for (int x = 0; x < 16; ++x) {
- for (int z = 0; z < 16; ++z) {
- double d = this.noiseGen.getNoise(x + chunkX * 16, z + chunkZ * 16);
- double d2 = this.noiseGen2.getNoise(x + chunkX * 16, z + chunkZ * 16);
- double d3 = this.noiseGen3.getCosNoise(x + chunkX * 16, z + chunkZ * 16);
-
- double yDev = d * 4 + d2 * 2 + d3;
-
- for (int y = 0; y < 128; ++y) {
- if (y < 60.0D + yDev) {
- idArray[this.getIndex(x, y, z)] = this.lowerBlockID;
- int var10001 = this.getIndex(x, y, z);
- metaArray[var10001] = 4;
- }
- }
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java
deleted file mode 100644
index 38c014a467..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128ba;
-
-import net.minecraft.world.biome.WorldChunkManager;
-import net.minecraft.world.chunk.IChunkProvider;
-
-import com.github.bartimaeusnek.bartworks.util.MathUtils;
-import com.github.bartimaeusnek.crossmod.galacticraft.planets.AbstractWorldProviderSpace;
-import com.github.bartimaeusnek.crossmod.galacticraft.solarsystems.Ross128SolarSystem;
-
-import micdoodle8.mods.galacticraft.api.galaxies.CelestialBody;
-import micdoodle8.mods.galacticraft.api.vector.Vector3;
-import micdoodle8.mods.galacticraft.core.world.gen.WorldChunkManagerMoon;
-
-public class WorldProviderRoss128ba extends AbstractWorldProviderSpace {
-
- @Override
- public Vector3 getFogColor() {
- return new Vector3(0, 0, 0);
- }
-
- @Override
- public Vector3 getSkyColor() {
- return new Vector3(0, 0, 0);
- }
-
- @Override
- public long getDayLength() {
- return MathUtils.floorLong(24000f * 9.9f / 100f);
- }
-
- @Override
- public boolean hasSunset() {
- return false;
- }
-
- @Override
- public Class<? extends IChunkProvider> getChunkProviderClass() {
- return ChunkProviderRoss128ba.class;
- }
-
- @Override
- public Class<? extends WorldChunkManager> getWorldChunkManagerClass() {
- return WorldChunkManagerMoon.class;
- }
-
- @Override
- public double getYCoordinateToTeleport() {
- return 500;
- }
-
- @Override
- public float getGravity() {
- return 0.060f;
- }
-
- @Override
- public double getMeteorFrequency() {
- return 9D;
- }
-
- @Override
- public double getFuelUsageMultiplier() {
- return 0.7D;
- }
-
- @Override
- public boolean canSpaceshipTierPass(int i) {
- return i >= Ross128SolarSystem.Ross128ba.getTierRequirement();
- }
-
- @Override
- public float getFallDamageModifier() {
- return 0.2f;
- }
-
- @Override
- public float getSoundVolReductionAmount() {
- return 20f;
- }
-
- @Override
- public float getThermalLevelModifier() {
- return 0;
- }
-
- @Override
- public float getWindLevel() {
- return 0;
- }
-
- @Override
- public CelestialBody getCelestialBody() {
- return Ross128SolarSystem.Ross128ba;
- }
-
- @Override
- public double getSolarEnergyMultiplier() {
- return 1.9D;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java
deleted file mode 100644
index f7bdec79eb..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.galacticraft.solarsystems;
-
-import static gregtech.api.enums.Mods.GalaxySpace;
-
-import java.util.Arrays;
-
-import net.minecraft.util.ResourceLocation;
-
-import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
-import com.github.bartimaeusnek.crossmod.BartWorksCrossmod;
-import com.github.bartimaeusnek.crossmod.galacticraft.UniversalTeleportType;
-import com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128b.WorldProviderRoss128b;
-import com.github.bartimaeusnek.crossmod.galacticraft.planets.ross128ba.WorldProviderRoss128ba;
-
-import micdoodle8.mods.galacticraft.api.GalacticraftRegistry;
-import micdoodle8.mods.galacticraft.api.galaxies.CelestialBody;
-import micdoodle8.mods.galacticraft.api.galaxies.GalaxyRegistry;
-import micdoodle8.mods.galacticraft.api.galaxies.Moon;
-import micdoodle8.mods.galacticraft.api.galaxies.Planet;
-import micdoodle8.mods.galacticraft.api.galaxies.SolarSystem;
-import micdoodle8.mods.galacticraft.api.galaxies.Star;
-import micdoodle8.mods.galacticraft.api.vector.Vector3;
-import micdoodle8.mods.galacticraft.api.world.IAtmosphericGas;
-import micdoodle8.mods.galacticraft.core.GalacticraftCore;
-
-public class Ross128SolarSystem {
-
- public static SolarSystem Ross128System;
- public static Star Ross128;
- public static Planet Ross128b;
- public static Moon Ross128ba;
-
- private Ross128SolarSystem() {}
-
- public static void init() {
-
- Ross128SolarSystem.Ross128System = new SolarSystem("Ross128System", "milkyWay")
- .setMapPosition(new Vector3(-0.5D, 0.65D, 0.0D));
- Ross128SolarSystem.Ross128 = (Star) new Star("Ross128").setParentSolarSystem(Ross128SolarSystem.Ross128System)
- .setTierRequired(-1);
- Ross128SolarSystem.Ross128.setUnreachable();
- Ross128SolarSystem.Ross128
- .setBodyIcon(new ResourceLocation(BartWorksCrossmod.MOD_ID + ":galacticraft/Ross128b/MapObjs/Ross128.png"));
- Ross128SolarSystem.Ross128System.setMainStar(Ross128SolarSystem.Ross128);
-
- Ross128SolarSystem.Ross128b = new Planet("Ross128b").setParentSolarSystem(Ross128SolarSystem.Ross128System);
- Ross128SolarSystem.Ross128b.setRingColorRGB(0x9F / 255f, 0x8A / 255f, 0x79 / 255f);
- Ross128SolarSystem.Ross128b.setPhaseShift(1.25F);
- Ross128SolarSystem.Ross128b.setBodyIcon(
- new ResourceLocation(BartWorksCrossmod.MOD_ID + ":galacticraft/Ross128b/MapObjs/Ross128b.png"));
- Ross128SolarSystem.Ross128b.setRelativeDistanceFromCenter(new CelestialBody.ScalableDistance(0.75F, 1.75F));
- Ross128SolarSystem.Ross128b.setRelativeOrbitTime(0.65F);
- Ross128SolarSystem.Ross128b.atmosphere
- .addAll(Arrays.asList(IAtmosphericGas.OXYGEN, IAtmosphericGas.NITROGEN, IAtmosphericGas.ARGON));
- Ross128SolarSystem.Ross128b.setDimensionInfo(ConfigHandler.ross128BID, WorldProviderRoss128b.class);
- Ross128SolarSystem.Ross128b.setTierRequired(ConfigHandler.ross128btier);
-
- Ross128SolarSystem.Ross128ba = new Moon("Ross128ba").setParentPlanet(Ross128SolarSystem.Ross128b);
- Ross128SolarSystem.Ross128ba.setRelativeDistanceFromCenter(new CelestialBody.ScalableDistance(10f, 15f))
- .setRelativeOrbitTime(1 / 0.01F);
- Ross128SolarSystem.Ross128ba.setBodyIcon(
- new ResourceLocation(BartWorksCrossmod.MOD_ID + ":galacticraft/Ross128b/MapObjs/Ross128ba.png"));
- Ross128SolarSystem.Ross128ba.setDimensionInfo(ConfigHandler.ross128BAID, WorldProviderRoss128ba.class);
- Ross128SolarSystem.Ross128ba
- .setTierRequired(GalaxySpace.isModLoaded() ? Math.min(ConfigHandler.ross128btier + 2, 8) : 3);
-
- GalaxyRegistry.registerSolarSystem(Ross128SolarSystem.Ross128System);
- GalaxyRegistry.registerPlanet(Ross128SolarSystem.Ross128b);
- GalaxyRegistry.registerMoon(Ross128SolarSystem.Ross128ba);
- GalacticraftRegistry.registerRocketGui(
- WorldProviderRoss128b.class,
- new ResourceLocation(GalacticraftCore.ASSET_PREFIX, "textures/gui/overworldRocketGui.png"));
- GalacticraftRegistry.registerRocketGui(
- WorldProviderRoss128ba.class,
- new ResourceLocation(GalacticraftCore.ASSET_PREFIX, "textures/gui/moonRocketGui.png"));
- GalacticraftRegistry.registerTeleportType(WorldProviderRoss128b.class, new UniversalTeleportType());
- GalacticraftRegistry.registerTeleportType(WorldProviderRoss128ba.class, new UniversalTeleportType());
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java b/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java
deleted file mode 100644
index cc9b1dcc2d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.openComputers;
-
-import net.minecraft.nbt.NBTTagCompound;
-
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
-
-public class GT_NBT_DataBase {
-
- private static final BiMap<NBTTagCompound, Long> tagIdBiMap = HashBiMap.create();
- private static final BiMap<GT_NBT_DataBase, Long> GTNBTBIMAP = HashBiMap.create();
-
- private static long maxID = Long.MIN_VALUE + 1;
-
- private final NBTTagCompound tagCompound;
-
- private final String mDataName;
- private final String mDataTitle;
- private long id;
-
- GT_NBT_DataBase(String mDataName, String mDataTitle, NBTTagCompound tagCompound) {
- this.mDataName = mDataName;
- this.mDataTitle = mDataTitle;
- this.tagCompound = tagCompound;
- this.id = GT_NBT_DataBase.maxID;
- GT_NBT_DataBase.tagIdBiMap.put(tagCompound, this.id);
- GT_NBT_DataBase.GTNBTBIMAP.put(this, this.id);
- ++GT_NBT_DataBase.maxID;
- }
-
- static GT_NBT_DataBase getGTTagFromId(Long id) {
- return GT_NBT_DataBase.GTNBTBIMAP.inverse()
- .get(id);
- }
-
- static Long getIdFromGTTag(GT_NBT_DataBase tagCompound) {
- return GT_NBT_DataBase.GTNBTBIMAP.get(tagCompound);
- }
-
- static NBTTagCompound getTagFromId(Long id) {
- return GT_NBT_DataBase.tagIdBiMap.inverse()
- .get(id);
- }
-
- static Long getIdFromTag(NBTTagCompound tagCompound) {
- return GT_NBT_DataBase.tagIdBiMap.get(tagCompound);
- }
-
- public NBTTagCompound getTagCompound() {
- return this.tagCompound;
- }
-
- public String getmDataName() {
- return this.mDataName;
- }
-
- static long getMaxID() {
- return GT_NBT_DataBase.maxID;
- }
-
- public String getmDataTitle() {
- return this.mDataTitle;
- }
-
- public long getId() {
- return this.id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- private GT_NBT_DataBase(NBTTagCompound tagCompound, String mDataName, String mDataTitle, long id) {
- this.tagCompound = tagCompound;
- this.mDataName = mDataName;
- this.mDataTitle = mDataTitle;
- this.id = id;
- }
-
- public static GT_NBT_DataBase makeNewWithoutRegister(String mDataName, String mDataTitle,
- NBTTagCompound tagCompound) {
- return new GT_NBT_DataBase(tagCompound, mDataName, mDataTitle, Long.MIN_VALUE);
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java b/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java
deleted file mode 100644
index fdfe3d7ee9..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.openComputers;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import net.minecraft.client.renderer.texture.IIconRegister;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.inventory.ISidedInventory;
-import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntity;
-
-import com.github.bartimaeusnek.bartworks.API.ITileAddsInformation;
-import com.github.bartimaeusnek.bartworks.API.ITileHasDifferentTextureSides;
-import com.github.bartimaeusnek.bartworks.API.SideReference;
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
-
-import cpw.mods.fml.common.Optional;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Mods;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.items.behaviors.Behaviour_DataOrb;
-import li.cil.oc.api.machine.Arguments;
-import li.cil.oc.api.machine.Callback;
-import li.cil.oc.api.machine.Context;
-import li.cil.oc.api.network.SimpleComponent;
-
-@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = Mods.Names.OPEN_COMPUTERS)
-public class TileEntity_GTDataServer extends TileEntity
- implements ISidedInventory, ITileAddsInformation, ITileHasDifferentTextureSides, SimpleComponent {
-
- private final BiMap<Long, GT_NBT_DataBase> OrbDataBase = HashBiMap.create();
-
- private ItemStack[] mItems = new ItemStack[2];
- private byte TickTimer;
-
- @Optional.Method(modid = Mods.Names.OPEN_COMPUTERS)
- public String getComponentName() {
- return "GT-Data Server";
- }
-
- @Optional.Method(modid = Mods.Names.OPEN_COMPUTERS)
- @Callback
- public Object[] listData(Context context, Arguments args) {
- Set<String> ret = new HashSet<>();
- for (Map.Entry<Long, GT_NBT_DataBase> entry : this.OrbDataBase.entrySet()) {
- ret.add(
- entry.getValue()
- .getId() + Long.MAX_VALUE
- + ". "
- + entry.getValue()
- .getmDataTitle());
- }
- return ret.toArray(new String[0]);
- }
-
- @Optional.Method(modid = Mods.Names.OPEN_COMPUTERS)
- @Callback
- public Object[] imprintOrb(Context context, Arguments args) {
- return new Object[] { false };
- }
-
- private boolean isServerSide() {
- return !this.worldObj.isRemote || SideReference.Side.Server;
- }
-
- @Override
- public void updateEntity() {
- if (this.TickTimer++ % 20 != 0) return;
-
- if (this.isServerSide()) {
- if (GT_Utility.areStacksEqual(this.mItems[0], ItemList.Tool_DataOrb.get(1))
- && this.mItems[0].hasTagCompound()) {
- if (GT_NBT_DataBase.getIdFromTag(this.mItems[0].getTagCompound()) == null) {
- this.OrbDataBase.put(
- GT_NBT_DataBase.getMaxID(),
- new GT_NBT_DataBase(
- Behaviour_DataOrb.getDataName(this.mItems[0]),
- Behaviour_DataOrb.getDataTitle(this.mItems[0]),
- this.mItems[0].getTagCompound()));
- } else {
- long id = GT_NBT_DataBase.getIdFromTag(this.mItems[0].getTagCompound());
- this.OrbDataBase.put(id, GT_NBT_DataBase.getGTTagFromId(id));
- }
- }
- if (GT_Utility.areStacksEqual(this.mItems[0], ItemList.Tool_DataStick.get(1))
- && this.mItems[0].hasTagCompound()) {
-
- String bookTitle = GT_Utility.ItemNBT.getBookTitle(this.mItems[0]);
- String punchcardData = GT_Utility.ItemNBT.getPunchCardData(this.mItems[0]);
- short mapID = GT_Utility.ItemNBT.getMapID(this.mItems[0]);
- byte data = (byte) (bookTitle.isEmpty() ? punchcardData.isEmpty() ? mapID != -1 ? 3 : -1 : 2 : 1);
-
- String title = data == 1 ? bookTitle
- : data == 2 ? punchcardData : data == 3 ? "" + mapID : "Custom Data";
- String name = data == 1 ? "eBook"
- : data == 2 ? "Punch Card Data" : data == 3 ? "Map Data" : "Custom Data";
- if (GT_NBT_DataBase.getIdFromTag(this.mItems[0].getTagCompound()) == null) {
- this.OrbDataBase.put(
- GT_NBT_DataBase.getMaxID(),
- new GT_NBT_DataBase(name, title, this.mItems[0].getTagCompound()));
- } else {
- long id = GT_NBT_DataBase.getIdFromTag(this.mItems[0].getTagCompound());
- this.OrbDataBase.put(id, GT_NBT_DataBase.getGTTagFromId(id));
- }
- }
- }
- }
-
- @Override
- public String[] getInfoData() {
- return new String[0];
- }
-
- @Override
- public void registerBlockIcons(IIconRegister par1IconRegister) {}
-
- @Override
- public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
- return new int[0];
- }
-
- @Override
- public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) {
- return false;
- }
-
- @Override
- public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) {
- return false;
- }
-
- @Override
- public int getSizeInventory() {
- return this.mItems.length;
- }
-
- @Override
- public ItemStack getStackInSlot(int slotIn) {
- return slotIn == 0 ? this.mItems[0] : this.mItems[1];
- }
-
- @Override
- public ItemStack decrStackSize(int index, int count) {
- return null;
- }
-
- @Override
- public ItemStack getStackInSlotOnClosing(int index) {
- return null;
- }
-
- @Override
- public void setInventorySlotContents(int index, ItemStack stack) {
- if (index > 1 || index < 0) return;
- this.mItems[index] = stack;
- }
-
- @Override
- public String getInventoryName() {
- return null;
- }
-
- @Override
- public boolean hasCustomInventoryName() {
- return false;
- }
-
- @Override
- public int getInventoryStackLimit() {
- return 1;
- }
-
- @Override
- public boolean isUseableByPlayer(EntityPlayer player) {
- return true;
- }
-
- @Override
- public void openInventory() {}
-
- @Override
- public void closeInventory() {}
-
- @Override
- public boolean isItemValidForSlot(int index, ItemStack stack) {
- return index == 0;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java
deleted file mode 100644
index a760c5e256..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech;
-
-import static gregtech.api.enums.Mods.GalactiGreg;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry;
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-import com.github.technus.tectech.recipe.TT_recipeAdder;
-
-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 TecTechResearchLoader {
-
- public static void runResearches() {
- Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
- ? FluidRegistry.getFluid("molten.indalloy140")
- : FluidRegistry.getFluid("molten.solderingalloy");
-
- if (GalactiGreg.isModLoaded()) {
- TT_recipeAdder.addResearchableAssemblylineRecipe(
- ItemRegistry.voidminer[0].copy(),
- 1024000,
- 256,
- (int) TierEU.RECIPE_ZPM,
- 24,
- new Object[] { ItemRegistry.voidminer[0].copy(),
- GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackPlutonium, 9L),
- Materials.BlackPlutonium.getPlates(3), ItemList.Electric_Motor_ZPM.get(9L),
- ItemList.Sensor_ZPM.get(9L), ItemList.Field_Generator_ZPM.get(9L),
- GT_OreDictUnificator.get(OrePrefixes.screw, Materials.BlackPlutonium, 36L) },
- new FluidStack[] { new FluidStack(solderIndalloy, 1440), WerkstoffLoader.Krypton.getFluidOrGas(20000) },
- ItemRegistry.voidminer[1].copy(),
- 5 * MINUTES,
- (int) TierEU.RECIPE_ZPM);
-
- TT_recipeAdder.addResearchableAssemblylineRecipe(
- ItemRegistry.voidminer[1].copy(),
- 8192000,
- 512,
- (int) TierEU.RECIPE_UV,
- 64,
- new Object[] { ItemRegistry.voidminer[1].copy(),
- GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 9L),
- Materials.Neutronium.getPlates(3), ItemList.Electric_Motor_UV.get(9L), ItemList.Sensor_UV.get(9L),
- ItemList.Field_Generator_UV.get(9L),
- GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 36L) },
- new FluidStack[] { new FluidStack(solderIndalloy, 1440),
- WerkstoffLoader.Oganesson.getFluidOrGas(20000) },
- ItemRegistry.voidminer[2].copy(),
- 5 * MINUTES,
- (int) TierEU.RECIPE_UV);
- }
-
- TT_recipeAdder.addResearchableAssemblylineRecipe(
- ItemList.Machine_Multi_ImplosionCompressor.get(1L),
- 64000,
- 48,
- (int) TierEU.RECIPE_UV,
- 8,
- new Object[] { ItemList.Machine_Multi_ImplosionCompressor.get(1L), Materials.Neutronium.getBlocks(5),
- GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Osmium, 64),
- GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Osmium, 64),
- GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 64),
- ItemList.Electric_Piston_UV.get(64), },
- new FluidStack[] { new FluidStack(solderIndalloy, 1440), Materials.Osmium.getMolten(1440),
- Materials.Neutronium.getMolten(1440) },
- ItemRegistry.eic.copy(),
- 5 * MINUTES,
- (int) TierEU.RECIPE_UV);
-
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java
deleted file mode 100644
index e3a2065ed5..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered;
-
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel;
-import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Energy;
-
-import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-
-public interface LowPowerLaser extends IMetaTileEntity, IConnectsToEnergyTunnel {
-
- boolean isSender();
-
- boolean isReceiver();
-
- boolean isTunnel();
-
- default boolean isConnectedCorrectly(ForgeDirection side) {
- return false;
- }
-
- default void setEUVar(long aEnergy) {}
-
- default long getAMPERES() {
- return -1;
- }
-
- default long maxEUInput() {
- return -1;
- }
-
- default long maxEUOutput() {
- return -1;
- }
-
- default long maxEUStore() {
- return -1;
- }
-
- default long getTotalPower() {
- return this.getAMPERES() * Math.max(this.maxEUOutput(), this.maxEUInput()) - this.getAMPERES() / 20;
- }
-
- default void moveAroundLowPower(IGregTechTileEntity aBaseMetaTileEntity) {
- byte color = this.getBaseMetaTileEntity()
- .getColorization();
- if (color >= 0) {
- ForgeDirection front = aBaseMetaTileEntity.getFrontFacing();
- ForgeDirection opposite = front.getOpposite();
-
- for (short dist = 1; dist < 250; ++dist) {
- IGregTechTileEntity tGTTileEntity = aBaseMetaTileEntity
- .getIGregTechTileEntityAtSideAndDistance(front, dist);
- if (tGTTileEntity == null || tGTTileEntity.getColorization() != color) {
- return;
- }
-
- IMetaTileEntity aMetaTileEntity = tGTTileEntity.getMetaTileEntity();
- if (aMetaTileEntity == null) {
- return;
- }
-
- if (aMetaTileEntity instanceof LowPowerLaser lowPowerLaser && lowPowerLaser.isReceiver()
- && opposite == tGTTileEntity.getFrontFacing()) {
- if (this.maxEUOutput() > lowPowerLaser.maxEUInput()
- || this.getAMPERES() > lowPowerLaser.getAMPERES()) {
- aMetaTileEntity.doExplosion(this.maxEUOutput());
- this.setEUVar(aBaseMetaTileEntity.getStoredEU() - this.maxEUOutput());
- return;
- }
-
- if (this.maxEUOutput() == lowPowerLaser.maxEUInput()) {
- long diff = Math.min(
- this.getAMPERES() * 20L * this.maxEUOutput(),
- Math.min(
- lowPowerLaser.maxEUStore() - aMetaTileEntity.getBaseMetaTileEntity()
- .getStoredEU(),
- aBaseMetaTileEntity.getStoredEU()));
- this.setEUVar(aBaseMetaTileEntity.getStoredEU() - diff);
- lowPowerLaser.setEUVar(
- aMetaTileEntity.getBaseMetaTileEntity()
- .getStoredEU() + diff);
- }
- return;
- }
-
- if ((!(aMetaTileEntity instanceof LowPowerLaser lowPowerLaser) || !lowPowerLaser.isTunnel())
- && !(aMetaTileEntity instanceof GT_MetaTileEntity_Pipe_Energy)) {
- return;
- }
-
- if (aMetaTileEntity instanceof GT_MetaTileEntity_Pipe_Energy tePipeEnergy) {
- if (tePipeEnergy.connectionCount < 2) {
- return;
- }
- tePipeEnergy.markUsed();
- return;
- }
-
- if (aMetaTileEntity instanceof LowPowerLaser lowPowerLaser && lowPowerLaser.isTunnel()
- && !lowPowerLaser.isConnectedCorrectly(front)) {
- return;
- }
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java
deleted file mode 100644
index c1d751739f..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered;
-
-import java.util.Optional;
-
-import net.minecraft.entity.player.EntityPlayer;
-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.interfaces.ITexture;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
-
-public abstract class TT_Abstract_LowPowerLaserThingy extends GT_MetaTileEntity_TieredMachineBlock
- implements LowPowerLaser {
-
- protected long AMPERES;
-
- public TT_Abstract_LowPowerLaserThingy(int aID, String aName, String aNameRegional, int aTier, long aAmperes,
- int aInvSlotCount, String aDescription, ITexture... aTextures) {
- super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
- this.AMPERES = aAmperes;
- }
-
- public TT_Abstract_LowPowerLaserThingy(int aID, String aName, String aNameRegional, int aTier, long aAmperes,
- int aInvSlotCount, String[] aDescription, ITexture... aTextures) {
- super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
- this.AMPERES = aAmperes;
- }
-
- public TT_Abstract_LowPowerLaserThingy(String aName, int aTier, long aAmperes, int aInvSlotCount,
- String aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, aInvSlotCount, aDescription, aTextures);
- this.AMPERES = aAmperes;
- }
-
- public TT_Abstract_LowPowerLaserThingy(String aName, int aTier, long aAmperes, int aInvSlotCount,
- String[] aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, aInvSlotCount, aDescription, aTextures);
- this.AMPERES = aAmperes;
- }
-
- @Override
- public long getAMPERES() {
- return this.AMPERES;
- }
-
- @Override
- public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
- ItemStack itemStack) {
- return false;
- }
-
- @Override
- public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
- ItemStack itemStack) {
- return false;
- }
-
- @Override
- public boolean isInputFacing(ForgeDirection side) {
- return true;
- }
-
- @Override
- public boolean isOutputFacing(ForgeDirection side) {
- return true;
- }
-
- @Override
- public boolean shouldJoinIc2Enet() {
- return true;
- }
-
- @Override
- public boolean isGivingInformation() {
- return true;
- }
-
- @Override
- public void saveNBTData(NBTTagCompound nbtTagCompound) {
- Optional.ofNullable(nbtTagCompound)
- .ifPresent(tag -> tag.setLong("AMPERES", this.AMPERES));
- }
-
- @Override
- public void loadNBTData(NBTTagCompound nbtTagCompound) {
- if (nbtTagCompound != null && nbtTagCompound.hasKey("AMPERES")) {
- this.AMPERES = nbtTagCompound.getLong("AMPERES");
- }
- }
-
- @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 false;
- }
-
- @Override
- public boolean isEnetOutput() {
- return false;
- }
-
- @Override
- public long maxEUInput() {
- return GT_Values.V[this.mTier];
- }
-
- @Override
- public long maxEUOutput() {
- return GT_Values.V[this.mTier];
- }
-
- @Override
- public boolean isTeleporterCompatible() {
- return false;
- }
-
- @Override
- public long getMinimumStoredEU() {
- return GT_Values.V[this.mTier + 1];
- }
-
- @Override
- public long maxEUStore() {
- return 512L + GT_Values.V[this.mTier + 1] * 24L * this.AMPERES;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java
deleted file mode 100644
index b79ddb4a44..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered;
-
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-
-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;
-
-public class TT_MetaTileEntity_LowPowerLaserBox extends TT_Abstract_LowPowerLaserThingy {
-
- public TT_MetaTileEntity_LowPowerLaserBox(int aID, String aName, String aNameRegional, int aTier, long aAmperes,
- ITexture... aTextures) {
- super(aID, aName, aNameRegional, aTier, aAmperes, 0, new String[0], aTextures);
- }
-
- public TT_MetaTileEntity_LowPowerLaserBox(String aName, int aTier, long aAmperes, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aAmperes, 0, aDescription, aTextures);
- }
-
- @Override
- public boolean isSender() {
- return this.getBaseMetaTileEntity()
- .isAllowedToWork();
- }
-
- @Override
- public boolean isReceiver() {
- return !this.getBaseMetaTileEntity()
- .isAllowedToWork();
- }
-
- @Override
- public boolean isTunnel() {
- return false;
- }
-
- @Override
- public long maxAmperesOut() {
- return !this.getBaseMetaTileEntity()
- .isAllowedToWork() ? this.AMPERES : 0;
- }
-
- @Override
- public long maxAmperesIn() {
- return this.getBaseMetaTileEntity()
- .isAllowedToWork() ? this.AMPERES + this.AMPERES / 4 : 0;
- }
-
- @Override
- public boolean hasAlternativeModeText() {
- return true;
- }
-
- @Override
- public String getAlternativeModeText() {
- return this.isReceiver() ? "Set to receiving mode" : "Set to sending mode";
- }
-
- @Override
- public boolean isEnetInput() {
- return this.getBaseMetaTileEntity()
- .isAllowedToWork();
- }
-
- @Override
- public boolean isEnetOutput() {
- return !this.getBaseMetaTileEntity()
- .isAllowedToWork();
- }
-
- @Override
- public boolean canConnect(ForgeDirection side) {
- return side == this.getBaseMetaTileEntity()
- .getFrontFacing();
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new TT_MetaTileEntity_LowPowerLaserBox(
- this.mName,
- this.mTier,
- this.AMPERES,
- this.mDescriptionArray,
- this.mTextures);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (aBaseMetaTileEntity.isServerSide()) {
- aBaseMetaTileEntity.setActive(aBaseMetaTileEntity.isAllowedToWork());
-
- byte Tick = (byte) (int) (aTick % 20L);
- if (16 == Tick) {
- if (aBaseMetaTileEntity.getStoredEU() > 0L) {
- this.setEUVar(aBaseMetaTileEntity.getStoredEU() - this.AMPERES);
- if (aBaseMetaTileEntity.getStoredEU() < 0L) {
- this.setEUVar(0L);
- }
- }
- if (this.getBaseMetaTileEntity()
- .isAllowedToWork() && aBaseMetaTileEntity.getStoredEU() > this.getMinimumStoredEU()) {
- this.moveAroundLowPower(aBaseMetaTileEntity);
- }
- }
- }
- }
-
- @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[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[this.mTier] };
- rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[this.mTier] };
- rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[this.mTier] };
- rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT[this.mTier] };
- rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT[this.mTier] };
- rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT[this.mTier] };
- rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
- rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
- rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
- rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT[this.mTier] };
- rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT[this.mTier] };
- rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][i + 1],
- com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT[this.mTier] };
- }
-
- return rTextures;
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
- int aColorIndex, boolean aActive, boolean aRedstone) {
- return this.mTextures[Math.min(2, side.ordinal()) + (side == facing ? 3 : 0) + (aActive ? 0 : 6)][aColorIndex
- + 1];
- }
-
- @Override
- public String[] getDescription() {
- return new String[] { "Like a Tranformer... but for LAZORZ",
- "Transfer rate: " + ChatColorHelper.YELLOW
- + GT_Utility.formatNumbers(this.getTotalPower())
- + ChatColorHelper.WHITE
- + " EU/t",
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get() };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java
deleted file mode 100644
index 5a9cd8048b..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered;
-
-import net.minecraft.util.EnumChatFormatting;
-import net.minecraft.util.StatCollector;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoTunnel;
-
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.MetaTileEntity;
-import gregtech.api.util.GT_Utility;
-
-public class TT_MetaTileEntity_LowPowerLaserDynamo extends GT_MetaTileEntity_Hatch_DynamoTunnel
- implements LowPowerLaser {
-
- public TT_MetaTileEntity_LowPowerLaserDynamo(int aID, String aName, String aNameRegional, int aTier, int aAmp) {
- super(aID, aName, aNameRegional, aTier, aAmp);
- }
-
- public TT_MetaTileEntity_LowPowerLaserDynamo(String aName, int aTier, int aAmp, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aAmp, aDescription, aTextures);
- }
-
- @Override
- public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new TT_MetaTileEntity_LowPowerLaserDynamo(
- this.mName,
- this.mTier,
- this.Amperes,
- this.mDescriptionArray,
- this.mTextures);
- }
-
- @Override
- public boolean isSender() {
- return true;
- }
-
- @Override
- public boolean isReceiver() {
- return false;
- }
-
- @Override
- public boolean isTunnel() {
- return false;
- }
-
- @Override
- public long getAMPERES() {
- return this.Amperes;
- }
-
- @Override
- public String[] getDescription() {
- return ArrayUtils.addAll(
- this.mDescriptionArray,
- StatCollector.translateToLocal("gt.blockmachines.hatch.dynamotunnel.desc.1") + ": "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(this.getTotalPower())
- + EnumChatFormatting.RESET
- + " EU/t",
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get());
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (aBaseMetaTileEntity.isServerSide()) {
- byte Tick = (byte) (int) (aTick % 20L);
- if (16 == Tick && aBaseMetaTileEntity.getStoredEU() > 0L) {
- this.setEUVar(aBaseMetaTileEntity.getStoredEU() - this.Amperes);
- if (aBaseMetaTileEntity.getStoredEU() < 0L) {
- this.setEUVar(0L);
- }
- }
- if (aBaseMetaTileEntity.getStoredEU() > this.getMinimumStoredEU()) {
- this.moveAroundLowPower(aBaseMetaTileEntity);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java
deleted file mode 100644
index 6b6b6c3558..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered;
-
-import net.minecraft.util.EnumChatFormatting;
-import net.minecraft.util.StatCollector;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel;
-
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.MetaTileEntity;
-import gregtech.api.util.GT_Utility;
-
-public class TT_MetaTileEntity_LowPowerLaserHatch extends GT_MetaTileEntity_Hatch_EnergyTunnel
- implements LowPowerLaser {
-
- public TT_MetaTileEntity_LowPowerLaserHatch(int aID, String aName, String aNameRegional, int aTier, int aAmp) {
- super(aID, aName, aNameRegional, aTier, aAmp);
- }
-
- public TT_MetaTileEntity_LowPowerLaserHatch(String aName, int aTier, int aAmp, String[] aDescription,
- ITexture[][][] aTextures) {
- super(aName, aTier, aAmp, aDescription, aTextures);
- }
-
- @Override
- public String[] getDescription() {
- return ArrayUtils.addAll(
- this.mDescriptionArray,
- StatCollector.translateToLocal("gt.blockmachines.hatch.energytunnel.desc.1") + ": "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(this.getTotalPower())
- + EnumChatFormatting.RESET
- + " EU/t",
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get());
- }
-
- @Override
- public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new TT_MetaTileEntity_LowPowerLaserHatch(
- this.mName,
- this.mTier,
- this.Amperes,
- this.mDescriptionArray,
- this.mTextures);
- }
-
- @Override
- public boolean isSender() {
- return false;
- }
-
- @Override
- public boolean isReceiver() {
- return true;
- }
-
- @Override
- public boolean isTunnel() {
- return false;
- }
-
- @Override
- public long getAMPERES() {
- return this.Amperes;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java
deleted file mode 100644
index 38ad31688d..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import net.minecraft.block.Block;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference;
-import com.github.bartimaeusnek.bartworks.util.ChatColorHelper;
-
-import gregtech.api.enums.Materials;
-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_MetaPipeEntity_Cable;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_CoverBehavior;
-import gregtech.common.GT_Client;
-import ic2.core.Ic2Items;
-
-public class TT_MetaTileEntity_Pipe_Energy_LowPower extends GT_MetaPipeEntity_Cable implements LowPowerLaser {
-
- public TT_MetaTileEntity_Pipe_Energy_LowPower(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional, 0.25f, Materials.BorosilicateGlass, 0, 0, 0, false, false);
- }
-
- public TT_MetaTileEntity_Pipe_Energy_LowPower(String aName, float aThickNess, Materials aMaterial,
- long aCableLossPerMeter, long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) {
- super(aName, aThickNess, aMaterial, aCableLossPerMeter, aAmperage, aVoltage, aInsulated, aCanShock);
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return new TT_MetaTileEntity_Pipe_Energy_LowPower(
- this.mName,
- this.mThickNess,
- this.mMaterial,
- this.mCableLossPerMeter,
- this.mAmperage,
- this.mVoltage,
- this.mInsulated,
- this.mCanShock);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (aTick % 20 == 13 && aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) {
- aBaseMetaTileEntity.issueTextureUpdate();
- }
- }
-
- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection siide, byte aConnections,
- int aColorIndex, boolean aConnected, boolean aRedstone) {
- return new ITexture[] { TextureFactory.of(
- Block.getBlockFromItem(Ic2Items.glassFiberCableBlock.getItem()),
- Ic2Items.glassFiberCableBlock.getItemDamage(),
- siide) };
- }
-
- @Override
- public String[] getDescription() {
- return new String[] { "Primitive Laser Cable intended for Low Power Applications", "Does not auto-connect",
- "Does not turn or bend",
- ChatColorHelper.WHITE + "Must be "
- + ChatColorHelper.YELLOW
- + "c"
- + ChatColorHelper.RED
- + "o"
- + ChatColorHelper.BLUE
- + "l"
- + ChatColorHelper.DARKPURPLE
- + "o"
- + ChatColorHelper.GOLD
- + "r"
- + ChatColorHelper.DARKRED
- + "e"
- + ChatColorHelper.DARKGREEN
- + "d"
- + ChatColorHelper.WHITE
- + " in order to work",
- BW_Tooltip_Reference.ADDED_BY_BARTIMAEUSNEK_VIA_BARTWORKS.get() };
- }
-
- @Override
- public boolean isSender() {
- return false;
- }
-
- @Override
- public boolean isReceiver() {
- return false;
- }
-
- @Override
- public boolean isTunnel() {
- return true;
- }
-
- public boolean canConnect(ForgeDirection side) {
- return true;
- }
-
- @Override
- public boolean isGivingInformation() {
- return false;
- }
-
- @Override
- public boolean isConnectedCorrectly(ForgeDirection side) {
- return this.isConnectedAtSide(side) && this.isConnectedAtSide(side.getOpposite());
- }
-
- @Override
- public boolean shouldJoinIc2Enet() {
- return false;
- }
-
- @Override
- public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
- return 0L;
- }
-
- @Override
- @Deprecated
- public long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage,
- ArrayList<TileEntity> aAlreadyPassedTileEntityList) {
- return 0L;
- }
-
- @Override
- public long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage,
- HashSet<TileEntity> aAlreadyPassedSet) {
- return 0L;
- }
-
- @Override
- public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
- ICoverable aTileEntity) {
- return true;
- }
-
- @Override
- public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
- ICoverable aTileEntity) {
- return true;
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java b/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java
deleted file mode 100644
index 2959bc2fb2..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.github.bartimaeusnek.crossmod.tgregworks;
-
-import static gregtech.api.enums.Mods.TinkersGregworks;
-
-import net.minecraftforge.common.config.Property;
-
-import com.github.bartimaeusnek.bartworks.API.API_REFERENCE;
-import com.github.bartimaeusnek.bartworks.MainMod;
-import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
-
-import cpw.mods.fml.common.Mod;
-import cpw.mods.fml.common.event.FMLInitializationEvent;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import vexatos.tgregworks.TGregworks;
-import vexatos.tgregworks.item.ItemTGregPart;
-import vexatos.tgregworks.reference.Config;
-
-@Mod(
- modid = MaterialsInjector.MOD_ID,
- name = MaterialsInjector.NAME,
- version = MaterialsInjector.VERSION,
- dependencies = """
- required-after:IC2;\
- required-after:gregtech;\
- required-after:bartworks;\
- before:TGregworks;\
- before:miscutils;""")
-public class MaterialsInjector {
-
- public static final String NAME = "BartWorks Mod Additions - TGregworks Container";
- public static final String VERSION = API_REFERENCE.VERSION;
- public static final String MOD_ID = "bartworkscrossmodtgregworkscontainer";
-
- @Mod.EventHandler
- public void init(FMLInitializationEvent init) {
- if (TinkersGregworks.isModLoaded()) {
- MaterialsInjector.run();
- }
- }
-
- public static void run() {
- MainMod.LOGGER.info("Registering TGregworks - BartWorks tool parts.");
- Werkstoff.werkstoffHashSet.stream()
- .filter(x -> x.hasItemType(OrePrefixes.gem) || x.hasItemType(OrePrefixes.plate))
- .map(Werkstoff::getBridgeMaterial)
- .filter(x -> x.mMetaItemSubID == -1)
- .filter(x -> x.mDurability != 0)
- .forEach(m -> {
- setConfigProps(m);
- registerParts(m);
- });
-
- TGregworks.registry.configProps.clear();
- TGregworks.registry.configIDs.clear();
-
- ItemTGregPart.toolMaterialNames = TGregworks.registry.toolMaterialNames;
- }
-
- private static void registerParts(Materials m) {
- TGregworks.registry.toolMaterialNames.add(m.mDefaultLocalName);
- int matID = TGregworks.registry.getMaterialID(m);
-
- TGregworks.registry.addToolMaterial(matID, m);
- TGregworks.registry.addBowMaterial(matID, m);
- TGregworks.registry.addArrowMaterial(matID, m);
-
- TGregworks.registry.matIDs.put(m, matID);
- TGregworks.registry.materialIDMap.put(matID, m);
- }
-
- private static void setConfigProps(Materials m) {
- if (TGregworks.config.get(Config.Category.Enable, m.mName, true)
- .getBoolean(true)) {
- TGregworks.registry.toolMaterials.add(m);
- Property configProp = TGregworks.config
- .get(Config.onMaterial(Config.MaterialID), m.mName, 0, null, 0, 100000);
- TGregworks.registry.configProps.put(m, configProp);
- TGregworks.registry.configIDs.add(configProp.getInt());
- }
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java b/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java
deleted file mode 100644
index c52e440383..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.thaumcraft.tile;
-
-import net.minecraft.item.ItemStack;
-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_MultiBlockBase;
-
-public class GT_Multi_IndustrialCrucible extends GT_MetaTileEntity_MultiBlockBase {
-
- public GT_Multi_IndustrialCrucible(int aID, String aName, String aNameRegional) {
- super(aID, aName, aNameRegional);
- }
-
- public GT_Multi_IndustrialCrucible(String aName) {
- super(aName);
- }
-
- @Override
- public boolean isCorrectMachinePart(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public boolean checkRecipe(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public boolean checkMachine(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
- return false;
- }
-
- @Override
- public int getMaxEfficiency(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getPollutionPerTick(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public int getDamageToComponent(ItemStack itemStack) {
- return 0;
- }
-
- @Override
- public boolean explodesOnComponentBreak(ItemStack itemStack) {
- return false;
- }
-
- @Override
- public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
- return null;
- }
-
- @Override
- public String[] getDescription() {
- return new String[0];
- }
-
- @Override
- public ITexture[] getTexture(IGregTechTileEntity iGregTechTileEntity, ForgeDirection side, ForgeDirection facing,
- int colorIndex, boolean b3, boolean b4) {
- return new ITexture[0];
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java b/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java
deleted file mode 100644
index 79e606d536..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.thaumcraft.tile;
-
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.crossmod.thaumcraft.util.ThaumcraftHandler;
-
-import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.items.GT_MetaBase_Item;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer;
-import gregtech.api.util.GT_ModHandler;
-import ic2.api.item.ElectricItem;
-import ic2.api.item.IElectricItem;
-
-public class GT_WandBuffer extends GT_MetaTileEntity_BasicBatteryBuffer {
-
- public GT_WandBuffer(int aID, String aName, String aNameRegional, int aTier, String aDescription, int aSlotCount) {
- super(aID, aName, aNameRegional, aTier, aDescription, aSlotCount);
- }
-
- public GT_WandBuffer(String aName, int aTier, String aDescription, ITexture[][][] aTextures, int aSlotCount) {
- super(aName, aTier, aDescription, aTextures, aSlotCount);
- }
-
- public GT_WandBuffer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, int aSlotCount) {
- super(aName, aTier, aDescription, aTextures, aSlotCount);
- }
-
- @Override
- public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
- if (aBaseMetaTileEntity.isServerSide()) {
- this.mCharge = aBaseMetaTileEntity.getStoredEU() / 2L > aBaseMetaTileEntity.getEUCapacity() / 3L;
- this.mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3L;
- this.mBatteryCount = 0;
- this.mChargeableCount = 0;
-
- for (ItemStack tStack : this.mInventory) {
- if (ThaumcraftHandler.isWand(tStack)) {
- ++this.mBatteryCount;
- ++this.mChargeableCount;
- }
- }
- }
- }
-
- public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, byte aSide, ItemStack aStack) {
- return ThaumcraftHandler.isWand(aStack);
- }
-
- public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, byte aSide, ItemStack aStack) {
- return ThaumcraftHandler.isWand(aStack);
- }
-
- @Override
- public int getInventoryStackLimit() {
- return 1;
- }
-
- @Override
- public long[] getStoredEnergy() {
- boolean scaleOverflow = false;
- boolean storedOverflow = false;
- long tScale = this.getBaseMetaTileEntity()
- .getEUCapacity();
- long tStored = this.getBaseMetaTileEntity()
- .getStoredEU();
- long tStep;
- if (this.mInventory != null) {
-
- for (ItemStack aStack : this.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] > 4611686018427387903L) {
- scaleOverflow = true;
- }
-
- tScale += stats[0];
- tStep = ((GT_MetaBase_Item) aStack.getItem()).getRealCharge(aStack);
- if (tStep > 4611686018427387903L) {
- storedOverflow = true;
- }
-
- tStored += tStep;
- }
- } else if (aStack.getItem() instanceof IElectricItem) {
- tStored += (long) ElectricItem.manager.getCharge(aStack);
- tScale += (long) ((IElectricItem) aStack.getItem()).getMaxCharge(aStack);
- }
- }
- }
- }
-
- if (scaleOverflow) {
- tScale = 9223372036854775807L;
- }
-
- if (storedOverflow) {
- tStored = 9223372036854775807L;
- }
-
- return new long[] { tStored, tScale };
- }
-}
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java b/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java
deleted file mode 100644
index 9492a6c077..0000000000
--- a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
- * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
- * portions of the Software. 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 OR COPYRIGHT HOLDERS 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.
- */
-
-package com.github.bartimaeusnek.crossmod.thaumcraft.util;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.world.biome.BiomeGenBase;
-
-import com.github.bartimaeusnek.bartworks.API.API_ConfigValues;
-import com.github.bartimaeusnek.bartworks.util.Pair;
-import com.github.bartimaeusnek.bartworks.util.log.DebugLog;
-
-import gregtech.api.enums.TC_Aspects;
-
-public class ThaumcraftHandler {
-
- private ThaumcraftHandler() {}
-
- private static Integer taintBiomeID;
- private static Integer magicalForestBiomeID;
- private static Class<?> mWandInterface;
-
- static {
- try {
- ThaumcraftHandler.mWandInterface = Class.forName("thaumcraft.common.items.wands.ItemWandCasting");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public static boolean isWand(ItemStack aStack) {
- try {
- return aStack != null && ThaumcraftHandler.mWandInterface.isAssignableFrom(
- aStack.getItem()
- .getClass());
- } catch (Throwable var3) {
- return false;
- }
- }
-
- public static boolean isMagicalForestBiome(int biomeID) {
- if (ThaumcraftHandler.magicalForestBiomeID == null) {
- try {
- BiomeGenBase biome = (BiomeGenBase) Class
- .forName("thaumcraft.common.lib.world.ThaumcraftWorldGenerator")
- .getField("biomeMagicalForest")
- .get(null);
- return biomeID == (ThaumcraftHandler.magicalForestBiomeID = biome.biomeID);
- } catch (ClassCastException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
- e.printStackTrace();
- return false;
- }
- }
- return biomeID == ThaumcraftHandler.magicalForestBiomeID;
- }
-
- public static boolean isTaintBiome(int biomeID) {
- if (ThaumcraftHandler.taintBiomeID == null) {
- try {
- BiomeGenBase TaintBiome = (BiomeGenBase) Class
- .forName("thaumcraft.common.lib.world.ThaumcraftWorldGenerator")
- .getField("biomeTaint")
- .get(null);
- return biomeID == (ThaumcraftHandler.taintBiomeID = TaintBiome.biomeID);
- } catch (ClassCastException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
- e.printStackTrace();
- return false;
- }
- }
- return biomeID == ThaumcraftHandler.taintBiomeID;
- }
-
- public static class AspectAdder {
-
- public static Class<?> mAspectListClass;
- public static Class<?> mAspectClass;
- public static Method registerObjectTag;
- public static Method addToList;
- public static Method getName;
- public static Method writeAspectListToNBT;
- public static Method readAspectListFromNBT;
- public static Method add;
- public static Method getAmount;
- public static Method getAspects;
- public static Method isResearchComplete;
- public static Field linkedAspektList;
-
- static {
- try {
- ThaumcraftHandler.AspectAdder.mAspectListClass = Class.forName("thaumcraft.api.aspects.AspectList");
- ThaumcraftHandler.AspectAdder.mAspectClass = Class.forName("thaumcraft.api.aspects.Aspect");
- ThaumcraftHandler.AspectAdder.addToList = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getMethod("add", ThaumcraftHandler.AspectAdder.mAspectClass, int.class);
- ThaumcraftHandler.AspectAdder.registerObjectTag = Class.forName("thaumcraft.api.ThaumcraftApi")
- .getMethod("registerObjectTag", ItemStack.class, ThaumcraftHandler.AspectAdder.mAspectListClass);
- ThaumcraftHandler.AspectAdder.getName = ThaumcraftHandler.AspectAdder.mAspectClass.getMethod("getName");
- ThaumcraftHandler.AspectAdder.writeAspectListToNBT = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getMethod("writeToNBT", NBTTagCompound.class);
- ThaumcraftHandler.AspectAdder.add = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getMethod("add", ThaumcraftHandler.AspectAdder.mAspectListClass);
- ThaumcraftHandler.AspectAdder.getAmount = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getMethod("getAmount", ThaumcraftHandler.AspectAdder.mAspectClass);
- ThaumcraftHandler.AspectAdder.getAspects = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getMethod("getAspects");
- ThaumcraftHandler.AspectAdder.readAspectListFromNBT = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getMethod("readFromNBT", NBTTagCompound.class);
- ThaumcraftHandler.AspectAdder.isResearchComplete = Class
- .forName("thaumcraft.common.lib.research.ResearchManager")
- .getMethod("isResearchComplete", String.class, String.class);
- ThaumcraftHandler.AspectAdder.linkedAspektList = ThaumcraftHandler.AspectAdder.mAspectListClass
- .getField("aspects");
- } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException e) {
- e.printStackTrace();
- }
- }
-
- @SafeVarargs
- public static void addAspectViaBW(ItemStack stack, Pair<Object, Integer>... aspectPair) {
- if (stack == null || stack.getItem() == null || stack.getUnlocalizedName() == null) return;
- try {
- Object aspectList = ThaumcraftHandler.AspectAdder.mAspectListClass.getConstructor()
- .newInstance();
- for (Pair<Object, Integer> a : aspectPair) {
- if (API_ConfigValues.debugLog) DebugLog.log(
- "Stack:" + stack.getDisplayName()
- + " Damage:"
- + stack.getItemDamage()
- + " aspectPair: "
- + ThaumcraftHandler.AspectAdder.getName.invoke(a.getKey())
- + " / "
- + a.getValue());
- ThaumcraftHandler.AspectAdder.addToList.invoke(aspectList, a.getKey(), a.getValue());
- }
- ThaumcraftHandler.AspectAdder.registerObjectTag.invoke(null, stack, aspectList);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public static void addAspectViaGT(ItemStack stack, TC_Aspects.TC_AspectStack... tc_aspectStacks) {
- try {
- Object aspectList = ThaumcraftHandler.AspectAdder.mAspectListClass.getConstructor()
- .newInstance();
- for (TC_Aspects.TC_AspectStack tc_aspects : tc_aspectStacks) ThaumcraftHandler.AspectAdder.addToList
- .invoke(aspectList, tc_aspects.mAspect.mAspect, (int) tc_aspects.mAmount);
- ThaumcraftHandler.AspectAdder.registerObjectTag.invoke(null, stack, aspectList);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-}
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/bartworks/lang/de_DE.lang b/src/main/resources/assets/bartworks/lang/de_DE.lang
deleted file mode 100644
index 23edaf6124..0000000000
--- a/src/main/resources/assets/bartworks/lang/de_DE.lang
+++ /dev/null
@@ -1,152 +0,0 @@
-BW_GlasBlocks.0.name=Borosilicat Glass Block
-BW_GlasBlocks.1.name=Nickel Verstärkter Borosilicate Glass Block
-BW_GlasBlocks.10.name=Farbiger Borosilicate Glass Block (Hell Grün)
-BW_GlasBlocks.11.name=Farbiger Borosilicate Glass Block (Braun)
-BW_GlasBlocks.12.name=Thorium Yttrium Glass Block
-BW_GlasBlocks.2.name=Tungsten Verstärkter Borosilicate Glass Block
-BW_GlasBlocks.3.name=Chrome Verstärkter Borosilicate Glass Block
-BW_GlasBlocks.4.name=Iridium Verstärkter Borosilicate Glass Block
-BW_GlasBlocks.5.name=Osmium Verstärkter Borosilicate Glass Block
-BW_GlasBlocks.6.name=Farbiger Borosilicate Glass Block (Rot)
-BW_GlasBlocks.7.name=Farbiger Borosilicate Glass Block (Grün)
-BW_GlasBlocks.8.name=Farbiger Borosilicate Glass Block (Lila)
-BW_GlasBlocks.9.name=Farbiger Borosilicate Glass Block (Gelb)
-BW_ItemBlocks.0.name=Geätzte Lapis Zelle
-BW_ItemBlocks.1.name=Plattierte Lapis Zelle
-BW_Machinery_Casings.0.name=Nickel-Zinc Ferrite Block
-BW_Machinery_Casings.1.name=Transformer-Wicklungs Block
-GT_LESU_CASING.0.name=LESU Hülle
-filled.item.petriDish.name=Petri Schale mit einer Kultur
-item.Agarose.name=Agarose
-item.BW_CombinedRotor.name=Primitiver Multi-Material Rotor (nur Wind)
-item.BW_LeatherRotor.name=Primitiver Leder Rotor (nur Wind)
-item.BW_PaperRotor.name=Primitiver Papier Rotor (nur Wind)
-item.BW_SimpleWindMeter.name=Einfaches Wind Meter
-item.BW_WoolRotor.name=Primitiver Wolle Rotor (nur Wind)
-item.BWmotor.name=Einfache Wärmekraftmaschine
-item.BWrawtube.name=Verlängerte Glass Röhre
-item.BWstove.name=Einfacher Beheizter Ofen
-item.Cells.name=Bakterien Zellen
-item.DNASampleFlask.name=DNA-Proben Flasche
-item.DetergentPowder.name=Waschmittel
-item.GT_Rockcutter_Item_HV.name=Steinschneider HV
-item.GT_Rockcutter_Item_LV.name=Steinschneider LV
-item.GT_Rockcutter_Item_MV.name=Steinschneider MV
-item.GT_Teslastaff_Item.name=Teslastab
-item.IncubationModule.name=Incubations Modul
-item.PlasmaMembrane.name=Plasma Membran
-item.PlasmidCell.name=Plasmid-Proben Flasche
-item.completed_grindstone.name=Mahlstein
-item.grindstone_bottom.name=Unteres Teil des Mahlsteins
-item.grindstone_top.name=Oberes Teil des Mahlsteins
-item.petriDish.name=Sterilisierte Petri Schale
-item.rotors.combinedParts.name=Multi-Material umspannter Holzrahmen
-item.rotors.leatherParts.name=Leder umspannter Holzrahmen
-item.rotors.paperParts.name=Papier umspannter Holzrahmen
-item.rotors.woolParts.name=Wolle umspannter Holzrahmen
-itemGroup.BioTab=BartWorks BioEngineering
-itemGroup.GT2C=Gregtech 2 Compat
-itemGroup.bartworks=BartWorks Inter Temporal
-itemGroup.bartworksMetaMaterials=BartWorks' Meta Materials
-itemGroup.bw.MetaItems.0=BartWorks Circuit Overhaul Items
-labModule.item.ClonalCellularSynthesisModule.name=Zelluläres Clone Modul
-labModule.item.DNAExtractionModule.name=DNA Extractions Modul
-labModule.item.PCRThermoclyclingModule.name=PCR Thermozykler
-labModule.item.PlasmidSynthesisModule.name=Plasmid Synthese Modul
-labModule.item.TransformationModule.name=Transformations Modul
-moon.Ross128ba=Ross128ba
-
-# RecipeMap
-bw.recipe.biolab=Bio Labor
-bw.recipe.BacteriaVat=Bacterien Tank
-bw.fuels.acidgens=Säure Generator
-
-nei.biovat.0.name=Braucht Glass Tier: %s
-nei.biovat.1.name=Braucht genau Sievert: %s Sv
-nei.biovat.2.name=Braucht mindestens Sievert: %s Sv
-
-planet.Ross128b=Ross128b
-solarsystem.Ross128System=Ross128-System
-star.Ross128=Ross128
-tile.BWHeatedWaterPump.0.name=Einfache Stirling Wasser Pumpe
-tile.BWRotorBlock.0.name=Primitive Kinetische Achsen Box
-tile.acidgenerator.name=Säure Generator
-tile.biolab.name=Bio Labor
-tile.biovat.name=Bacterien Tank
-tile.bw.mbf.name=Mega Brennofen
-tile.bw.mvf.name=Mega Vacuum Gefrierer
-tile.bw.windmill.name=Windmühle
-tile.diode.name=Kabel Diode
-tile.energydistributor.name=Energie Distributor
-tile.manutrafo.name=Manualeller Trafo
-tile.radiohatch.name=Radio Hülle
-tooltip.LESU.0.name=Maximale Kapazität!
-tooltip.LESU.1.name=Mehrere Kontroller!
-tooltip.bw.0.name=Hinzugefügt von
-tooltip.bw.1.name=Hinzugefügt von bartimaeusnek durch
-tooltip.bw.empty.name=Leer
-tooltip.bw.kg.0.name=kg
-tooltip.bw.kg.1.name=kgs
-tooltip.bw.no.name=Nein
-tooltip.bw.tier.name=Tier:
-tooltip.bw.yes.name=Ja
-tooltip.cp.0.name=Ist ein Chip drinnen?
-tooltip.glas.0.name=Glass-Tier:
-tooltip.labmodule.0.name=A Module used to change the BioLab's working Mode
-tooltip.labparts.0.name=An empty Sterilized Petri Dish.
-tooltip.labparts.1.name=An empty DNA Flask.
-tooltip.labparts.2.name=An empty Plasmid Cell.
-tooltip.labparts.3.name=A special washing power for Bio Engineering.
-tooltip.labparts.4.name=A powder for the separation of DNA by electrophoresis.
-tooltip.labparts.5.name=A Petri Dish containing:
-tooltip.labparts.6.name=This is a weak culture, it can not be bred in the Bacterial Vat!
-tooltip.labparts.7.name=A DNA Flask containing:
-tooltip.labparts.8.name=A Plasmid Cell containing:
-tooltip.rotor.0.name=Durchmesser:
-tooltip.rotor.1.name=Haltbarkeit:
-tooltip.rotor.2.name=Effizienz:
-tooltip.teslastaff.0.name=Keine Garantie!
-tooltip.tile.acidgen.0.name=Ein Säure Generator
-tooltip.tile.acidgen.1.name=Creates Power from Chemical Energy Potentials.
-tooltip.tile.biolab.0.name=The BioLab, a Multi-Use Bioengineering Station
-tooltip.tile.diode.0.name=A Simple diode that will allow Energy Flow in only one direction.
-tooltip.tile.energydistributor.0.name=Splits Amperage into several Sides.
-tooltip.tile.lesu.0.name=Controller Block for the GT2-Styled L.E.S.U.;Size: ANY
-tooltip.tile.lesu.1.name=Storage per LESU Casing:
-tooltip.tile.lesu.2.name=Output EU: LESU Casings amount;Input EU: Next Voltage Tier to Output EU;Input/Output Amps can be configured via 4 Circuits in GUI;Output Side has a dot on it.
-tooltip.tile.lesu.3.name=Only one Controller allowed, no Wallsharing!
-tooltip.tile.manualtravo.0.name=Controller Block for the Manual Trafo;Operates in 4 different Modes:;Mode 1: Circuit 0 in controller: Direct-Upstep;Mode 2: Circuit 1 in controller: Direct-Downstep;Mode 3: Circuit 2 in controller: Tapped-Upstep;Mode 4: Circuit 3 in controller: Tapped-Downstep;For direct Modes: 3xHx3;Base Contains at least 1 Energy Hatch;1 Layer of Transformer-Winding Blocks for each Tier transformed;Middle of Transformer-Winding Blocks needs to be a Nickel-Zinc Ferrite Block;Top Contains at least 1 Dynamo Hatch;Maintenance Hatch can be placed anywhere;Tapped Mode is disabled at the Moment.
-tooltip.tile.mbf.0.name=Controller Block for the Mega Blast Furnace;Size(WxHxD): 15x20x15 (Hollow);Controller: 3nd Layer Middle Center;Inner 13x18x13 Heating Coils (Hollow);Outer 15x18x15 Borosilicate Glass;The glass limits the Energy Input tier;1+ Input Hatch/Bus (Any casing);1+ Output Bus (Any casing);1+ Energy Hatch (Any casing);1x Maintenance Hatch (Any casing);13x13 Muffler Hatches (Top middle);Heat Proof Machine Casings for the outer 15x15 (Layer 20);1+ Output Hatch to recover CO2/CO/SO2 (optional, any top layer casing); Recovery scales with Muffler Hatch tier;Heat Proof Machine Casings for Base;Each 900K over the min. Heat Capacity grants 5% speedup (multiplicatively);Each 1800K over the min. Heat Capacity allows for one upgraded overclock;Upgraded overclocks reduce recipe time to 25% and increase EU/t to 400%;Causes maximum
-tooltip.tile.mbf.1.name=Pollution per second
-tooltip.tile.radhatch.0.name=Radioactive Item Chamber for Multiblocks
-tooltip.tile.radhatch.1.name=Use a screwdriver to set the containment level
-tooltip.tile.radhatch.2.name=Material:
-tooltip.tile.radhatch.3.name=Sievert:
-tooltip.tile.radhatch.4.name=Menge:
-tooltip.tile.radhatch.5.name=Time (in t/s/m/h) to decay (1kg):
-tooltip.tile.radhatch.6.name=t
-tooltip.tile.radhatch.7.name=s
-tooltip.tile.radhatch.8.name=m
-tooltip.tile.radhatch.9.name=h
-tooltip.tile.tiereddsc.0.name=Voltage:
-tooltip.tile.tiereddsc.1.name=Amperage IN:
-tooltip.tile.tiereddsc.2.name=Amperage OUT:
-tooltip.tile.tiereddsc.3.name=Kapazität:
-tooltip.tile.waterpump.0.name=Produziert
-tooltip.tile.waterpump.1.name=L/s Wasser wenn laufend.
-tooltip.tile.waterpump.2.name=Muss auf dem Boden stehen.
-tooltip.tile.windmill.0.name=A primitive Grinder powered by Kinetic energy.;Size(WxHxD): 7x12x7;Layer 1: 7x7 Bricks, corners are air, controller at front centered.;Layer 2-5: 5x5 Hardened Clay, corners are air, can contain one door,;hollow, Wall must contain at least one Dispenser;Layer 6: 5x5 Wood Planks. Corners are filled, hollow.;Layer 7: 7x7 Wood Planks. Corners are air, hollow.;Layer 8: 7x7 Wood Planks. Corners are air, hollow,;front centered must be a Primitive Kinetic Shaftbox;Layer 9: 7x7 Wood Planks. Corners are air, hollow.;Layer 10: 5x5 Wood Planks. Corners are filled, hollow.;Layer 11: 3x3 Wood Planks. Corners are filled, hollow.;Layer 12: 1x1 Wood Plank.;Needs a Wind Mill Rotor in the Shaftbox to operate;Input items in Controller;Output items will appear in the dispensers;It is faster in regions with more wind (like IC2 Windmills)
-tooltip.windmeter.0.name=Ein einfaches Windmeter, um einen Platz für die Windmühle zu finden.
-tooltip.windmeter.1.name=Benutzungen:
-tooltip.windmeter.2.name=nicht da zu sein.
-tooltip.windmeter.3.name=sehr niedrig zu sein.
-tooltip.windmeter.4.name=normal zu sein.
-tooltip.windmeter.5.name=eher stark zu sein.
-tooltip.windmeter.6.name=sehr stark zu sein.
-tooltip.windmeter.7.name=zu stark zu sein.
-tooltip.windmeter.8.name=Der Wind hier scheint
-
-item.BurnedOutBISOPelletBall.name=Ausgebranntes BISO Kügelchen Ball
-item.BurnedOutBISOPellet.name=Ausgebranntes BISO Kügelchen
-item.BurnedOutTRISOPelletBall.name=Ausgebranntes TRISO Kügelchen Ball
-item.BurnedOutTRISOPellet.name=Ausgebranntes TRISO Kügelchen
diff --git a/src/main/resources/assets/bartworks/lang/en_US.lang b/src/main/resources/assets/bartworks/lang/en_US.lang
deleted file mode 100644
index 7ec5d318d0..0000000000
--- a/src/main/resources/assets/bartworks/lang/en_US.lang
+++ /dev/null
@@ -1,202 +0,0 @@
-itemGroup.GT2C=Gregtech 2 Compat
-item.GT_Rockcutter_Item_LV.name=Rockcutter LV
-item.GT_Rockcutter_Item_MV.name=Rockcutter MV
-item.GT_Rockcutter_Item_HV.name=Rockcutter HV
-item.GT_Teslastaff_Item.name=Teslastaff
-BW_ItemBlocks.0.name=Etched Lapis Cell
-BW_ItemBlocks.1.name=Plated Lapis Cell
-GT_LESU_CASING.0.name=LESU Casing
-
-GT5U.gui.text.no_imprint=Missing imprint
-GT5U.gui.text.not_enough_length=Multiblock Too Short
-GT5U.gui.text.wrong_sievert_exactly=§7Wrong sievert. Requires exactly: %s §7Sv
-GT5U.gui.text.wrong_sievert_min=§7Wrong sievert. Requires at least: %s §7Sv
-
-itemGroup.bartworks=BartWorks Inter Temporal
-BW_Machinery_Casings.0.name=Nickel-Zinc Ferrite Block
-BW_Machinery_Casings.1.name=Transformer-Winding Block
-item.BW_PaperRotor.name=Primitive Paper Rotor (Wind only)
-item.BW_LeatherRotor.name=Primitive Leather Rotor (Wind only)
-item.BW_WoolRotor.name=Primitive Wool Rotor (Wind only)
-item.BW_CombinedRotor.name=Combined Primitive Rotor (Wind only)
-tile.BWRotorBlock.0.name=Primitive Kinetic Shaftbox
-item.grindstone_top.name=Grindstone Top Piece
-item.grindstone_bottom.name=Grindstone Bottom Piece
-item.completed_grindstone.name=Grindstone
-item.rotors.leatherParts.name=Leather Covered Wood Frame
-item.rotors.woolParts.name=Wool Covered Wood Frame
-item.rotors.paperParts.name=Paper Covered Wood Frame
-item.rotors.combinedParts.name=Multiple Material Covered Wood Frame
-item.BW_SimpleWindMeter.name=Simple Wind Meter
-tile.BWHeatedWaterPump.0.name=Simple Stirling Water Pump
-item.BWrawtube.name=Elongated Glass Tube
-item.BWmotor.name=Simple Stirling Motor
-item.BWstove.name=Simple Heated Stove
-
-itemGroup.BioTab=BartWorks BioEngineering
-filled.item.petriDish.name=Petri Dish with a Culture
-item.petriDish.name=Sterilized Petri Dish
-item.DNASampleFlask.name=DNA Sample Flask
-item.PlasmidCell.name=Plasmid Sample Flask
-item.DetergentPowder.name=Detergent Powder
-item.Agarose.name=Agarose
-item.IncubationModule.name=Incubation Module
-item.Cells.name=Bacterial Cells
-item.PlasmaMembrane.name=Plasma Membrane
-labModule.item.DNAExtractionModule.name=DNA Extraction Module
-labModule.item.PCRThermoclyclingModule.name=PCR Thermocycle Module
-labModule.item.PlasmidSynthesisModule.name=Plasmid Synthesis Module
-labModule.item.TransformationModule.name=Transformation Module
-labModule.item.ClonalCellularSynthesisModule.name=Clonal Cellular Synthesis Module
-BW_GlasBlocks.0.name=Borosilicate Glass Block
-BW_GlasBlocks.1.name=Titanium Reinforced Borosilicate Glass Block
-BW_GlasBlocks.2.name=Tungstensteel Reinforced Borosilicate Glass Block
-BW_GlasBlocks.3.name=Rhodium-Plated Palladium Reinforced Borosilicate Glass Block
-BW_GlasBlocks.4.name=Iridium Reinforced Borosilicate Glass Block
-BW_GlasBlocks.5.name=Osmium Reinforced Borosilicate Glass Block
-BW_GlasBlocks.6.name=Colored Borosilicate Glass Block (Red)
-BW_GlasBlocks.7.name=Colored Borosilicate Glass Block (Green)
-BW_GlasBlocks.8.name=Colored Borosilicate Glass Block (Purple)
-BW_GlasBlocks.9.name=Colored Borosilicate Glass Block (Yellow)
-BW_GlasBlocks.10.name=Colored Borosilicate Glass Block (Light Green)
-BW_GlasBlocks.11.name=Colored Borosilicate Glass Block (Brown)
-BW_GlasBlocks.12.name=Thorium Yttrium Glass Block
-BW_GlasBlocks.13.name=Neutronium Reinforced Borosilicate Glass Block
-BW_GlasBlocks.14.name=Cosmic Neutronium Reinforced Borosilicate Glass Block
-BW_GlasBlocks.15.name=Infinity Reinforced Borosilicate Glass Block
-BW_GlasBlocks2.0.name=Transcendentally Reinforced Borosilicate Glass Block
-
-tooltip.glas.0.name=Glass-Tier:
-tooltip.LESU.0.name=Maximum Capacity!
-tooltip.LESU.1.name=Multiple Controllers!
-
-tooltip.windmeter.0.name=A simple Windmeter to choose a place for the Windmill.
-tooltip.windmeter.1.name=Uses left:
-tooltip.windmeter.2.name=non existant
-tooltip.windmeter.3.name=pretty low
-tooltip.windmeter.4.name=common
-tooltip.windmeter.5.name=rather strong
-tooltip.windmeter.6.name=very strong
-tooltip.windmeter.7.name=too strong
-tooltip.windmeter.8.name=The wind here seems to be
-tooltip.rotor.0.name=Diameter:
-tooltip.rotor.1.name=Durability:
-tooltip.rotor.2.name=Efficiency:
-tooltip.rotor.3.name=Speed:
-tooltip.rotor.4.name=Output:
-tooltip.cp.0.name=Has Circuit inside?
-
-tooltip.bw.0.name=Added by
-tooltip.bw.1.name=Added by bartimaeusnek via
-tooltip.bw.yes.name=Yes
-tooltip.bw.no.name=No
-tooltip.bw.tier.name=Tier:
-tooltip.bw.kg.0.name=kg
-tooltip.bw.kg.1.name=kgs
-tooltip.bw.empty.name=Empty
-tooltip.bw.via.name=Added by %s§7 via §2BartWorks
-tooltip.bw.mb_via.name=%s§7 via §2BartWorks
-
-tooltip.teslastaff.0.name=No warranty!
-tooltip.labmodule.0.name=A Module used to change the BioLab's working Mode
-tooltip.labparts.0.name=An empty Sterilized Petri Dish.
-tooltip.labparts.1.name=An empty DNA Flask.
-tooltip.labparts.2.name=An empty Plasmid Cell.
-tooltip.labparts.3.name=A special washing powder for Bio Engineering.
-tooltip.labparts.4.name=A powder for the separation of DNA by electrophoresis.
-tooltip.labparts.5.name=A Petri Dish containing:
-tooltip.labparts.6.name=This is a weak culture, it can not be bred in the Bacterial Vat!
-tooltip.labparts.7.name=A DNA Flask containing:
-tooltip.labparts.8.name=A Plasmid Cell containing:
-
-tooltip.tile.waterpump.0.name=Produces
-tooltip.tile.waterpump.1.name=L/s Water when fueled. Causes %d Pollution per second.
-tooltip.tile.waterpump.2.name=Must be placed on the Ground.
-
-tooltip.tile.mbf.0.name=Controller Block for the Mega Blast Furnace;Size(WxHxD): 15x20x15 (Hollow);Controller: 3rd Layer Middle Center;Inner 13x18x13 Heating Coils (Hollow);Outer 15x18x15 Borosilicate Glass;The glass tier limits the Energy Input tier;1+ Input Hatch/Bus (Any casing);1+ Output Hatch/Bus (Any casing);1+ Energy Hatch (Any casing);1x Maintenance Hatch (Any casing);13x13 Muffler Hatches (Top middle);Heat Proof Machine Casings for the outer 15x15 (Layer 20);1+ Output Hatch to recover CO2/CO/SO2 (optional, any top layer casing); Recovery scales with Muffler Hatch tier;Heat Proof Machine Casings for Base;Each 900K over the min. Heat Capacity grants 5% speedup (multiplicatively);Each 1800K over the min. Heat Capacity allows for one upgraded overclock;Upgraded overclocks reduce recipe time to 25% and increase EU/t to 400%;Causes maximum
-tooltip.tile.mbf.1.name=Pollution per second
-tooltip.tile.windmill.0.name=A primitive Grinder powered by Kinetic energy.;Size(WxHxD): 7x12x7;Layer 1: 7x7 Bricks, corners are air, controller at front centered.;Layer 2-5: 5x5 Hardened Clay, corners are air, can contain one door,;hollow, Wall must contain at least one Dispenser;Layer 6: 5x5 Wood Planks. Corners are filled, hollow.;Layer 7: 7x7 Wood Planks. Corners are air, hollow.;Layer 8: 7x7 Wood Planks. Corners are air, hollow,;front centered must be a Primitive Kinetic Shaftbox;Layer 9: 7x7 Wood Planks. Corners are air, hollow.;Layer 10: 5x5 Wood Planks. Corners are filled, hollow.;Layer 11: 3x3 Wood Planks. Corners are filled, hollow.;Layer 12: 1x1 Wood Plank.;Needs a Wind Mill Rotor in the Shaftbox to operate;Input items in Controller;Output items will appear in the dispensers;It is faster in regions with more wind (like IC2 Windmills)
-tooltip.tile.lesu.0.name=Controller Block for the GT2-Styled L.E.S.U.;Size: ANY
-tooltip.tile.lesu.1.name=Storage per LESU Casing:
-tooltip.tile.lesu.2.name=Output EU: LESU Casings amount;Input EU: Next Voltage Tier to Output EU;Input/Output Amps can be configured via 4 Circuits in GUI;Output Side has a dot on it.
-tooltip.tile.lesu.3.name=Only one Controller allowed, no Wallsharing!
-tooltip.tile.manualtravo.0.name=Controller Block for the Manual Trafo;Operates in 4 different Modes:;Mode 1: Circuit 0 in controller: Direct-Upstep;Mode 2: Circuit 1 in controller: Direct-Downstep;Mode 3: Circuit 2 in controller: Tapped-Upstep;Mode 4: Circuit 3 in controller: Tapped-Downstep;For direct Modes: 3xHx3;Base Contains at least 1 Energy Hatch;1 Layer of Transformer-Winding Blocks for each Tier transformed;Middle of Transformer-Winding Blocks needs to be a Nickel-Zinc Ferrite Block;Top Contains at least 1 Dynamo Hatch;Maintenance Hatch can be placed anywhere;Tapped Mode is disabled at the Moment.
-tooltip.tile.tiereddsc.0.name=Voltage:
-tooltip.tile.tiereddsc.1.name=Amperage IN:
-tooltip.tile.tiereddsc.2.name=Amperage OUT:
-tooltip.tile.tiereddsc.3.name=Capacity:
-tooltip.tile.diode.0.name=A Simple diode that will allow Energy Flow in only one direction.
-tooltip.tile.energydistributor.0.name=Splits Amperage into several Sides.
-tooltip.tile.biolab.0.name=The BioLab, a Multi-Use Bioengineering Station
-tooltip.tile.radhatch.0.name=Radioactive Item Chamber for Multiblocks
-tooltip.tile.radhatch.1.name=Use a screwdriver to set the containment level
-tooltip.tile.radhatch.2.name=Material:
-tooltip.tile.radhatch.3.name=Sievert:
-tooltip.tile.radhatch.4.name=Amount:
-tooltip.tile.radhatch.5.name=Time (in t/s/m/h) to decay (1kg):
-tooltip.tile.radhatch.6.name=t
-tooltip.tile.radhatch.7.name=s
-tooltip.tile.radhatch.8.name=m
-tooltip.tile.radhatch.9.name=h
-tooltip.tile.radhatch.10.name=Remaining: %s s / %s s
-tooltip.tile.acidgen.0.name=An Acid Generator
-tooltip.tile.acidgen.1.name=Creates Power from Chemical Energy Potentials.
-
-# RecipeMap
-bw.recipe.biolab=Bio Lab
-bw.recipe.BacteriaVat=Bacterial Vat
-bw.fuels.acidgens=Acid Generator
-bw.recipe.cal=Circuit Assembly Line
-bw.recipe.radhatch=Radio Hatch Material List
-gt.recipe.electricimplosioncompressor=Electric Implosion Compressor
-bw.recipe.htgr=High Temperature Gas-cooled Reactor
-
-nei.biovat.0.name=Needs Glass Tier: %s
-nei.biovat.1.name=Need exactly Sievert: %s Sv
-nei.biovat.2.name=Need minimum Sievert: %s Sv
-nei.biovat.input.tooltip=Consumed up to 1,001x amount, depending on output rate
-nei.biovat.output.tooltip=Outputs up to 1,001x amount, depending on the amount of fluid stored in the Output Hatch
-
-tile.diode.name=Cable Diode
-tile.energydistributor.name=Energy Distributor
-tile.acidgenerator.name=Acid Generator
-tile.bw.mbf.name=Mega Blast Furnace
-tile.bw.mvf.name=Mega Vacuum Freezer
-tile.biolab.name=Bio Lab
-tile.biovat.name=Bacterial Vat
-tile.radiohatch.name=Radio Hatch
-tile.bw.windmill.name=Windmill
-tile.manutrafo.name=Manual Trafo
-tile.BioFluidBlock.name=Bio Fluid Block
-
-item.TRISOPellet.name=TRISO pebble
-item.TRISOPelletBall.name=TRISO pebble ball
-item.BISOPelletBall.name=BISO pebble ball
-item.TRISOPelletCompound.name=TRISO pebble compound
-item.BISOPelletCompound.name=BISO pebble compound
-item.BurnedOutTRISOPelletBall.name=Burned Out TRISO pebble ball
-item.BurnedOutTRISOPellet.name=Burned Out TRISO pebble
-
-itemGroup.bartworksMetaMaterials=BartWorks' Meta Materials
-
-planet.Ross128b=Ross128b
-moon.Ross128ba=Ross128ba
-star.Ross128=Ross128
-solarsystem.Ross128System=Ross128-System
-
-itemGroup.bw.MetaItems.0=BartWorks Circuit Overhaul Items
-
-BW.infoData.BioVat.expectedProduction=Expected Production
-BW.infoData.BioVat.production=Production
-
-BW.NEI.display.radhatch.0=Sievert: %s Sv
-BW.NEI.display.radhatch.1=Mass: %s kg
-BW.NEI.display.radhatch.2=Time: %s s
-
-misc.BatchModeTextOn=Batch recipes
-misc.BatchModeTextOff=Don't batch recipes
-
-tooltip.cal.imprintedWith=Imprinted with:
-chat.cal.mode.0=Circuit Assembly Line Mode
-chat.cal.mode.1=Circuit Assembler Mode
-#Liquids
diff --git a/src/main/resources/assets/bartworks/lang/fr_FR.lang b/src/main/resources/assets/bartworks/lang/fr_FR.lang
deleted file mode 100644
index a9f4964759..0000000000
--- a/src/main/resources/assets/bartworks/lang/fr_FR.lang
+++ /dev/null
@@ -1,160 +0,0 @@
-itemGroup.GT2C=Compatibilité Gregtech 2
-item.GT_Rockcutter_Item_LV.name=Coupeur de roche LV
-item.GT_Rockcutter_Item_MV.name=Coupeur de roche MV
-item.GT_Rockcutter_Item_HV.name=Coupeur de roche HV
-item.GT_Teslastaff_Item.name=Bâton Tesla
-BW_ItemBlocks.0.name=Cellule de Lapis Engravée
-BW_ItemBlocks.1.name=Cellule de Lapis Plaquée
-GT_LESU_CASING.0.name=Bloc carter du LESU
-
-itemGroup.bartworks=BartWorks inter-temporel
-BW_Machinery_Casings.0.name=Bloc de Ferrite en Nickel-Zinc
-BW_Machinery_Casings.1.name=Bloc de bobinage de Transformateur
-item.BW_PaperRotor.name=Rotor primitif en papier (Vent seulement)
-item.BW_LeatherRotor.name=Rotor primitif en cuir (Vent seulement)
-item.BW_WoolRotor.name=Rotor primitif en laine (Vent seulement)
-item.BW_CombinedRotor.name=Rotor primitif combiné (Vent seulement)
-tile.BWRotorBlock.0.name=Boîte d'arbre de transmission primitive
-item.grindstone_top.name=partie haute de Meule
-item.grindstone_bottom.name=partie basse de Meule
-item.completed_grindstone.name=Meule
-item.rotors.leatherParts.name=Charpente en bois recouverte de cuir
-item.rotors.woolParts.name=Charpente en bois recouverte de laine
-item.rotors.paperParts.name=Charpente en bois recouverte de papier
-item.rotors.combinedParts.name=Charpente en bois recouverte de plusieurs matériaux
-item.BW_SimpleWindMeter.name=Simple Anémomètre
-tile.BWHeatedWaterPump.0.name=Simple pompe à eau Stirling
-item.BWrawtube.name=Tube de Verre allongé
-item.BWmotor.name=Simple Moteur Stirling
-item.BWstove.name=Simple réchaud chauffé
-
-itemGroup.BioTab=Bio-ingéniérie BartWorks
-filled.item.petriDish.name=Boîte à Pétri avec culture
-item.petriDish.name=Boîte à Pétri stérilisée
-item.DNASampleFlask.name=Fiole d'échantillonnage ADN
-item.PlasmidCell.name=Fiole d'échantillonnage de Plasmide
-item.DetergentPowder.name=Poudre détergente
-item.Agarose.name=Agarose
-item.IncubationModule.name=Module d'incubation
-item.Cells.name=Cellules bactériennes
-item.PlasmaMembrane.name=Membrane Cellulaire
-labModule.item.DNAExtractionModule.name=Module d'extraction d'ADN
-labModule.item.PCRThermoclyclingModule.name=Module de thermocycle PCR
-labModule.item.PlasmidSynthesisModule.name=Module de synthèse pour Plasmides
-labModule.item.TransformationModule.name=Module de transformation
-labModule.item.ClonalCellularSynthesisModule.name=Module de synthèse cellulaire clonale
-BW_GlasBlocks.0.name=Bloc de Verre Borosilicate
-BW_GlasBlocks.1.name=Bloc de Verre Borosilicate renforcé en Nickel
-BW_GlasBlocks.2.name=Bloc de Verre Borosilicate renforcé en Tungsten
-BW_GlasBlocks.3.name=Bloc de Verre Borosilicate renforcé en Chrome
-BW_GlasBlocks.4.name=Bloc de Verre Borosilicate renforcé en Iridium
-BW_GlasBlocks.5.name=Bloc de Verre Borosilicate renforcé en Osmium
-BW_GlasBlocks.6.name=Bloc de Verre Borosilicate coloré (Rouge)
-BW_GlasBlocks.7.name=Bloc de Verre Borosilicate coloré (Vert)
-BW_GlasBlocks.8.name=Bloc de Verre Borosilicate coloré (Violet)
-BW_GlasBlocks.9.name=Bloc de Verre Borosilicate coloré (Jaune)
-BW_GlasBlocks.10.name=Bloc de Verre Borosilicate coloré (Vert Clair)
-BW_GlasBlocks.11.name=Bloc de Verre Borosilicate coloré (Marron)
-BW_GlasBlocks.12.name=Bloc de Verre Thorium Yttrium
-
-tooltip.glas.0.name=Tier de verre:
-tooltip.LESU.0.name=Capacité maximum!
-tooltip.LESU.1.name=Plusieurs contrôleurs!
-
-tooltip.windmeter.0.name=Un simple anémomètre pour choisir une place pour l'éolienne.
-tooltip.windmeter.1.name=Utilisations restantes:
-tooltip.windmeter.2.name=non existant
-tooltip.windmeter.3.name=plutôt léger
-tooltip.windmeter.4.name=commun
-tooltip.windmeter.5.name=plutôt fort
-tooltip.windmeter.6.name=très fort
-tooltip.windmeter.7.name=trop fort
-tooltip.windmeter.8.name=Le vent ici semble être
-tooltip.rotor.0.name=Diamètre:
-tooltip.rotor.1.name=Durabilité:
-tooltip.rotor.2.name=Efficacité
-tooltip.cp.0.name=Y-a-t-il un circuit dedans?
-
-tooltip.bw.0.name=Ajouté par
-tooltip.bw.1.name=Ajouté par bartimaeusnek via
-tooltip.bw.yes.name=Oui
-tooltip.bw.no.name=Non
-tooltip.bw.tier.name=Tier:
-tooltip.bw.kg.0.name=kg
-tooltip.bw.kg.1.name=kgs
-tooltip.bw.empty.name=Vide
-
-tooltip.teslastaff.0.name=Pas de garrantie!
-tooltip.labmodule.0.name=un module utilisé pour changer le mode de fonctionnement du BioLab
-tooltip.labparts.0.name=Une boîte de Pétrie vide stérélisée.
-tooltip.labparts.1.name=Une fiole d'ADN vide.
-tooltip.labparts.2.name=Une cellule de plasmide vide.
-tooltip.labparts.3.name=Un nettoyant spécial pour la Bio-ingéniérie.
-tooltip.labparts.4.name=Une poudre de séparation d'ADN par électrophorèse.
-tooltip.labparts.5.name=Une boîte de Pétri contenant:
-tooltip.labparts.6.name=Ceci est une culture faible, elle ne peut pas se reproduire dans la Bio Cuve!
-tooltip.labparts.7.name=Une fiole d'ADN contenant:
-tooltip.labparts.8.name=Une cellule de plasmide contenant:
-
-tooltip.tile.waterpump.0.name=Produit
-tooltip.tile.waterpump.1.name=L/s Water quand il est alimenté.
-tooltip.tile.waterpump.2.name=Doit être placé sur le sol.
-
-tooltip.tile.mbf.0.name=Bloc contrôleur pour le haut fourneau;Taille(LxHxP): 15x20x15 (creux);Contrôleur: 3ème couche centré au milieu;Intérieur 13x18x13 bobines de chauffage (creux);Extérieur 15x18x15 Verre Borosilicate;Le verre limite le tier d'énergie en entrée;1+ Trappe/Bus d'entrée (n'importe quel bloc carter);1+ bus de sortie(n'importe quel bloc carter);1+ trappe d'énergie (n'importe quel bloc carter);1x trappe de maintenance (n'importe quel bloc carter);Blocs carter de machine résistant à la chaleur pour l'extérieur 15x15 (couche 20);La récupération se câle sur le tier de la trappe d'échappement;Blocs carter de machine résistant à la chaleur pour la base;Chaque 900K supérieur à la température de base donne 5% de rapidité (multiplicativement);Chaque 1800k supérieur à la température de base donne un overclock gratuit;Chaque overclock reduit le temps de craft de 25% et augmente la consommation d'EU/t de 400%;Cause une pollution maximale.
-tooltip.tile.mbf.1.name=Pollution par seconde
-tooltip.tile.windmill.0.name=Un broyeur primitif fonctionnant a l'énergie cinétique.;Taille(LxHxP): 7x12x7;Couche 1: 7x7 Briques, les coins sont laissés vide,le contrôleur est centré devant.;(creux), les mur doivent contenir au moins un Dispenseur;Couche 7: 7x7 Planches de Bois. les coins sont laissés vide, (creux).;Couche 8: 7x7 Planches de Bois. les coins sont laissés vide, (creux),;le bloc centré devant doit être une Boîte d'arbre de transmission primitive.;Couche 9: 7x7 Planches de Bois. les coins sont laissés vide, (creux).;Couche 11: 3x3 Planches de Bois. les coins sont pleins, (creux).;A besoin d'un Rotor d'éolienne dans la Boîte d'arbre de transmission pour fonctionner.;Les objets d'entrée doivent aller dans le contrôleur.;Les objets de sortie apparaîtront dans les Dispenseurs.;C'est plus rapide dans les régions venteuses (comme les éoliennes IC2).
-tooltip.tile.lesu.0.name=Bloc contrôleur pour le GT2-Stylé L.E.S.U.;Taille: n'importe;
-tooltip.tile.lesu.1.name=Stockage par carter du LESU:
-tooltip.tile.lesu.2.name=EU de sortie: le nombre de blocs carter LESU;EU d'entrée: prochain Tier de voltage après les EU de sortie;l'ampérage d'entrée/sortie peut être configurée via 4 Circuits dans le GUI;La face de sortie à un point dessus.
-tooltip.tile.lesu.3.name=Seulement un seul contrôleur autorisé, pas de partage des murs!
-tooltip.tile.manualtravo.0.name=Bloc contrôleur pour le Transformateur Manuel;4 modes de fonctionnement;Fonctionne avec 2 modes en ce moment:;Mode 1: Circuit 0 dans le contrôleur: unique source et ascendant;Mode 2: Circuit 1 dans le contrôleur: unique source et descendant;Mode 3: Circuit 2 dans le contrôleur: plusieurs sources et ascendant;Mode 4: Circuit 3 dans le contrôleur: plusieurs sources et descendant;Pour les modes directs: 3xHx3;La base doit contenir au moins une trappe d'énergie;1 Couche de Blocs de bobinage de Transformateur pour chaque tier converti;Au milieu des Blocs de bobinage de Transformeur il doit y avoir un Bloc de Ferrite en Nickel-Zinc;Le haut doit contenir au moins une Trappe Dynamo;La trappe de maintenance peut être placée n'importe où;Les modes avec plusieurs sources sont désactivés pour le moment.
-tooltip.tile.tiereddsc.0.name=Voltage:
-tooltip.tile.tiereddsc.1.name=Ampérage d'entrée:
-tooltip.tile.tiereddsc.2.name=Ampérage de sortie:
-tooltip.tile.tiereddsc.3.name=Capacité:
-tooltip.tile.diode.0.name=Une simple diode qui autorise les flux d'énergie dans un seul sens.
-tooltip.tile.energydistributor.0.name=Répartit l'ampérage sur plusieur faces.
-tooltip.tile.biolab.0.name=Le BioLab, une station de bio-ingéniérie multifonction.
-tooltip.tile.radhatch.0.name=Radioactive Item Chamber for Multiblocks Chambre d'objets radiactifs pour multi-blocs
-tooltip.tile.radhatch.1.name=Utiliser un tournevis pour régler le niveau de confinement
-tooltip.tile.radhatch.2.name=Matériau:
-tooltip.tile.radhatch.3.name=Sievert:
-tooltip.tile.radhatch.4.name=Quantité:
-tooltip.tile.radhatch.5.name=Temps (en t/s/m/h) pour se désintégrer(1kg):
-tooltip.tile.radhatch.6.name=t
-tooltip.tile.radhatch.7.name=s
-tooltip.tile.radhatch.8.name=m
-tooltip.tile.radhatch.9.name=h
-tooltip.tile.acidgen.0.name=Un générateur à acide
-tooltip.tile.acidgen.1.name=Crée de l'énergie à partir de potentiels chimiques.
-
-# RecipeMap
-bw.recipe.biolab=Bio Lab
-bw.recipe.BacteriaVat=Bio Cuve
-bw.fuels.acidgens=Générateur à Acide
-
-nei.biovat.0.name=A besoin du tier de verre: %s
-nei.biovat.1.name=A besoin du montant exact Sievert: %s Sv
-nei.biovat.2.name=A besoin d'un minimum Sievert: %s Sv
-
-tile.diode.name=Diode câble
-tile.energydistributor.name=Distributeur d'énergie
-tile.acidgenerator.name=Générateur à Acide
-tile.bw.mbf.name=Méga Haut Fourneau
-tile.bw.mvf.name=Méga Refroidisseur A Vide
-tile.biolab.name=Bio Lab
-tile.biovat.name=Bio Cuve
-tile.radiohatch.name=Trappe Radioactive
-tile.bw.windmill.name=Eolienne
-tile.manutrafo.name=Transformateur Manuel
-
-
-itemGroup.bartworksMetaMaterials=Méta Matériaux De BartWorks
-
-
-planet.Ross128b=Ross128b
-moon.Ross128ba=Ross128ba
-star.Ross128=Ross128
-solarsystem.Ross128System=Système-Ross128
-
-itemGroup.bw.MetaItems.0=Objets du Remaniement des Circuits BartWorks
diff --git a/src/main/resources/assets/bartworks/lang/zh_CN.lang b/src/main/resources/assets/bartworks/lang/zh_CN.lang
deleted file mode 100644
index f3a9ca534d..0000000000
--- a/src/main/resources/assets/bartworks/lang/zh_CN.lang
+++ /dev/null
@@ -1,163 +0,0 @@
-itemGroup.GT2C=GergTech2兼容
-item.GT_Rockcutter_Item_LV.name=岩石切割者 LV
-item.GT_Rockcutter_Item_MV.name=岩石切割者 MV
-item.GT_Rockcutter_Item_HV.name=岩石切割者 HV
-item.GT_Teslastaff_Item.name=特斯拉权杖
-BW_ItemBlocks.0.name=蚀刻青金石元件
-BW_ItemBlocks.1.name=镀层青金石元件
-GT_LESU_CASING.0.name=LESU机械方块
-
-itemGroup.bartworks=BartWorks-跨时代
-BW_Machinery_Casings.0.name=镍锌铁氧体块
-BW_Machinery_Casings.1.name=变压器线圈块
-item.BW_PaperRotor.name=原始纸转子(风车专用)
-item.BW_LeatherRotor.name=原始皮革转子(风车专用)
-item.BW_WoolRotor.name=原始羊毛转子(风车专用)
-item.BW_CombinedRotor.name=原始复合转子(风车专用)
-tile.BWRotorBlock.0.name=原始动力轴箱
-item.grindstone_top.name=磨石顶部
-item.grindstone_bottom.name=磨石底部
-item.completed_grindstone.name=磨石
-item.rotors.leatherParts.name=皮革包层木框架
-item.rotors.woolParts.name=羊毛包层木框架
-item.rotors.paperParts.name=纸包层木框架
-item.rotors.combinedParts.name=复合材料包层木框架
-item.BW_SimpleWindMeter.name=简易风速计
-tile.BWHeatedWaterPump.0.name=简易斯特林水泵
-item.BWrawtube.name=加长玻璃管
-item.BWmotor.name=简易斯特林引擎
-item.BWstove.name=简易加热炉
-
-itemGroup.BioTab=BartWorks-生物工程
-filled.item.petriDish.name=培养皿
-item.petriDish.name=无菌培养皿
-item.DNASampleFlask.name=DNA样品烧瓶
-item.PlasmidCell.name=质粒样品烧瓶
-item.DetergentPowder.name=洗涤粉
-item.Agarose.name=琼脂糖
-item.IncubationModule.name=孵化模块
-item.Cells.name=细菌细胞
-item.PlasmaMembrane.name=质膜
-labModule.item.DNAExtractionModule.name=DNA提取模块
-labModule.item.PCRThermoclyclingModule.name=聚合酶链式反应模块
-labModule.item.PlasmidSynthesisModule.name=质粒合成模块
-labModule.item.TransformationModule.name=转化模块
-labModule.item.ClonalCellularSynthesisModule.name=克隆细胞合成模块
-BW_GlasBlocks.0.name=硼硅酸盐方块
-BW_GlasBlocks.1.name=镍强化硼硅酸盐方块
-BW_GlasBlocks.2.name=钨强化硼硅酸盐方块
-BW_GlasBlocks.3.name=铬强化硼硅酸盐方块
-BW_GlasBlocks.4.name=铱强化硼硅酸盐方块
-BW_GlasBlocks.5.name=锇强化硼硅酸盐方块
-BW_GlasBlocks.6.name=染色硼硅酸盐方块(红)
-BW_GlasBlocks.7.name=染色硼硅酸盐方块(绿)
-BW_GlasBlocks.8.name=染色硼硅酸盐方块(紫)
-BW_GlasBlocks.9.name=染色硼硅酸盐方块(黄)
-BW_GlasBlocks.10.name=染色硼硅酸盐方块(淡绿)
-BW_GlasBlocks.11.name=染色硼硅酸盐方块(棕)
-BW_GlasBlocks.12.name=钍钇玻璃块
-
-tooltip.glas.0.name=玻璃等级:
-tooltip.LESU.0.name=最大容量!
-tooltip.LESU.1.name=多个控制器!
-
-tooltip.windmeter.0.name=用于为风车选址的简易风速计.
-tooltip.windmeter.1.name=剩余使用次数:
-tooltip.windmeter.2.name=不存在的
-tooltip.windmeter.3.name=很低
-tooltip.windmeter.4.name=正常
-tooltip.windmeter.5.name=相当强
-tooltip.windmeter.6.name=很强
-tooltip.windmeter.7.name=太强了
-tooltip.windmeter.8.name=这里的风似乎...
-tooltip.rotor.0.name=直径:
-tooltip.rotor.1.name=耐久:
-tooltip.rotor.2.name=效率:
-tooltip.cp.0.name=内部是否有编程电路?
-
-tooltip.bw.0.name=Added by
-tooltip.bw.1.name=由bartimaeusnek添加
-tooltip.bw.yes.name=是
-tooltip.bw.no.name=否
-tooltip.bw.tier.name=等级:
-tooltip.bw.kg.0.name=kg
-tooltip.bw.kg.1.name=kgs
-tooltip.bw.empty.name=空
-
-tooltip.teslastaff.0.name=没有保修!
-tooltip.labmodule.0.name=用于更改生物实验室工作模式的模块
-tooltip.labparts.0.name=一个空的无菌培养皿
-tooltip.labparts.1.name=一个空的DNA烧瓶.
-tooltip.labparts.2.name=一个空的质粒单元.
-tooltip.labparts.3.name=生物工程专用洗涤粉
-tooltip.labparts.4.name=电泳分离DNA的粉末.
-tooltip.labparts.5.name=培养皿内含有:
-tooltip.labparts.6.name=这是一种很弱的培养菌,不能在细菌培养皿中繁殖!
-tooltip.labparts.7.name=一个DNA烧瓶,内含:
-tooltip.labparts.8.name=一个质粒单元,内含:
-
-tooltip.tile.waterpump.0.name=在有燃料时,产出
-tooltip.tile.waterpump.1.name=L/s水.
-tooltip.tile.waterpump.2.name=必须放在地上.
-
-tooltip.tile.mbf.0.name=巨型工业高炉的控制器方块;大小(宽x高x长):15x20x15(中空);控制器方块在第三层正面中央;内层13x18x13加热线圈(中空);外层15x18x15硼硅酸盐玻璃方块;玻璃等级限制了能源仓等级;1+输入仓/总线(任意机械方块);1+输出总线(任意机械方块);1+能源仓(任意机械方块);1x维护仓(任意机械方块)(注:所有底层仓室必须置于边缘);13x1x13消声仓(顶层中央);外部15x15的防热机械方块(第20层);1+输出仓以回收CO2/CO/SO2(可选,任意顶层机械方块);回收比例取决于消声仓等级;底层为隔热机械方块;自物品配方的最小炉温起,每高出900K会减少5%的能耗,使用乘法叠加;自物品配方的最小所需炉温起,每高出1800K将允许一次无损的超频;无损超频将减少加工时间至25%并提升功率至400%;每秒造成最大
-tooltip.tile.mbf.1.name=污染每秒
-tooltip.tile.windmill.0.name=由动能驱动的原始磨床;大小(宽x高x长):7x12x7;第1层:7x7砖块,角落空置,控制器方块在正面中央;第2-5层:5x5硬化粘土,角落空置,可包含一扇门,;中空,墙必须至少包含一个发射器;第6层:5x5木板.角落填充,中空.;第7层:7x7木板.角落空置,中空.;第8层:7x7木板.角落空置,中空,;正面中央必须是原始动力轴箱;第9层:7x7木板.角落空置,中空.;第10层:5x5木板.角落填充,中空.;第11层:3x3木板.角落填充,中空.;第12层:1x1木板;需要在轴箱中放入风车转子才可运行;在控制器中输入物品;输出物品将出现在发射器中;在风大的地区运行较快(像IC2风机一样)
-tooltip.tile.lesu.0.name=用于GT2风格的L.E.S.U.的控制器方块;尺寸:任意
-tooltip.tile.lesu.1.name=每个LESU机械方块存储:
-tooltip.tile.lesu.2.name=输出EU:LESU机械方块数量; 输入EU:输出EU的下一电压等级;输入/输出安培可通过GUI中的4个编程电路进行调整;输出端只有一个点.
-tooltip.tile.lesu.3.name=只允许一个控制器,不允许墙壁共享!
-tooltip.tile.manualtravo.0.name=手动变压器的控制器方块;可在4种不同的模式下运行:;模式1:控制器内放入编程电路0:直接升压;模式2:控制器内放入编程电路1:直接降压;模式3:控制器内放入编程电路2:Tapped升压;模式4:控制器内放入编程电路3:Tapped降压;直接模式(长x高x宽):3xHx3;底层至少包含一个能源仓;每1级变压器需要一层变压器线圈方块;变压器线圈方块中心需为镍锌铁氧体块;顶部至少包含一个动力仓;维护仓可置于任意位置;Tapped模式暂不可用.(Tapped模式为在变压时获得多个电压)(译注)
-tooltip.tile.tiereddsc.0.name=电压:
-tooltip.tile.tiereddsc.1.name=输入安培:
-tooltip.tile.tiereddsc.2.name=输出安培:
-tooltip.tile.tiereddsc.3.name=容量:
-tooltip.tile.diode.0.name=一个简单的二极管,只允许能量流向一个方向.
-tooltip.tile.energydistributor.0.name=将电流分至多个面.
-tooltip.tile.biolab.0.name=生物实验室,一个多用途的生物工程站
-tooltip.tile.radhatch.0.name=多方块机器的放射性物品输入仓
-tooltip.tile.radhatch.1.name=使用螺丝刀设置抑制等级
-tooltip.tile.radhatch.2.name=材料:
-tooltip.tile.radhatch.3.name=希沃特(Sv):
-tooltip.tile.radhatch.4.name=数量:
-tooltip.tile.radhatch.5.name=衰变单位质量(1kg)所需时间(t/s/m/h):
-tooltip.tile.radhatch.6.name=t
-tooltip.tile.radhatch.7.name=s
-tooltip.tile.radhatch.8.name=m
-tooltip.tile.radhatch.9.name=h
-tooltip.tile.acidgen.0.name=酸性发电机
-tooltip.tile.acidgen.1.name=用化学势能产生电力.
-
-# RecipeMap
-bw.recipe.biolab=生物实验室
-bw.recipe.BacteriaVat=生物培养缸
-bw.fuels.acidgens=酸性发电机
-
-nei.biovat.0.name=需要玻璃等级: %s
-nei.biovat.1.name=精确剂量 Sievert: %s Sv
-nei.biovat.2.name=最小剂量 Sievert: %s Sv
-
-tile.diode.name=线缆二极管
-tile.energydistributor.name=能量分配器
-tile.acidgenerator.name=酸性发电机
-tile.bw.mbf.name=巨型工业高炉
-tile.bw.mvf.name=巨型真空冷冻机
-tile.biolab.name=生物实验室
-tile.biovat.name=生物培养缸
-tile.radiohatch.name=放射仓
-tile.bw.windmill.name=风车
-tile.manutrafo.name=手动变压器
-
-itemGroup.bartworksMetaMaterials=BartWorks-meta材料
-
-
-planet.Ross128b=罗斯128b
-moon.Ross128ba=罗斯128ba
-star.Ross128=罗斯128
-solarsystem.Ross128System=罗斯128星系
-
-itemGroup.bw.MetaItems.0=BartWorks电路更新物品
-
-BW.infoData.BioVat.expectedProduction=预期产量
-BW.infoData.BioVat.production=产量
-#This zh_CN.lang is translated by huajijam for bartworks (19/7/19)
diff --git a/src/main/resources/assets/bartworks/sounds.json b/src/main/resources/assets/bartworks/sounds.json
deleted file mode 100644
index 0c1dea7fcc..0000000000
--- a/src/main/resources/assets/bartworks/sounds.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "hatch.RadOn": {
- "category": "block",
- "sounds": [
- {
- "name": "radhatch",
- "stream": false
- }
- ]
- }
-}
diff --git a/src/main/resources/assets/bartworks/sounds/radhatch.ogg b/src/main/resources/assets/bartworks/sounds/radhatch.ogg
deleted file mode 100644
index 754711c999..0000000000
--- a/src/main/resources/assets/bartworks/sounds/radhatch.ogg
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png b/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png
deleted file mode 100644
index aef2e1687b..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/background/brown.png b/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
deleted file mode 100644
index 2db03dff22..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png b/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
deleted file mode 100644
index c14cfb78ae..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
deleted file mode 100644
index a8d30a022e..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
deleted file mode 100644
index d7132dcfba..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
deleted file mode 100644
index 4244b6256b..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
deleted file mode 100644
index d051681c1e..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
deleted file mode 100644
index fb7483a9a7..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
deleted file mode 100644
index 5dc78c8271..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
deleted file mode 100644
index ca3b11d69d..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png b/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
deleted file mode 100644
index 34b2b59e0e..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png b/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
deleted file mode 100644
index de259fc32a..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png b/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
deleted file mode 100644
index 8b6425b8cf..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
deleted file mode 100644
index c2f1271f62..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
deleted file mode 100644
index e5cf55abd4..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
deleted file mode 100644
index eb908f863a..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png b/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
deleted file mode 100644
index fc6478c29f..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png b/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
deleted file mode 100644
index 4a54ac5781..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png b/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
deleted file mode 100644
index f9e55beeb9..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png b/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
deleted file mode 100644
index 3840d7fd45..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png b/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
deleted file mode 100644
index 0dfe303cf0..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png b/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
deleted file mode 100644
index 7a324ebf38..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png b/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
deleted file mode 100644
index b302f4e89e..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png b/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
deleted file mode 100644
index 4d8405e02c..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png b/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
deleted file mode 100644
index 73893b9036..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png b/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
deleted file mode 100644
index d5c9ae0825..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png b/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
deleted file mode 100644
index 5b3c3edec0..0000000000
--- a/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png b/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
deleted file mode 100644
index fc0872b45f..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
deleted file mode 100644
index 0e27ddbb62..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png b/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
deleted file mode 100644
index f711908135..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
deleted file mode 100644
index 92ce6cb9a2..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
deleted file mode 100644
index 0cc6e08ae3..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
deleted file mode 100644
index f230acbe3f..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
deleted file mode 100644
index 2febb0540d..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
deleted file mode 100644
index 89e0b0d84e..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
deleted file mode 100644
index 54c29e5ae9..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 2f58642a18..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png b/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
deleted file mode 100644
index 8922a3d4e2..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png b/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
deleted file mode 100644
index 6e2e7dfe4e..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 4710c28436..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 9a87942ef9..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
deleted file mode 100644
index 0fd516231e..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
deleted file mode 100644
index acdb3b4e6a..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
deleted file mode 100644
index 1feeb1fd92..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
deleted file mode 100644
index c6de6719e9..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
deleted file mode 100644
index f41b59f820..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 213f8feafd..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index c75fafb933..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png b/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
deleted file mode 100644
index f5976c093b..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index e5be40d5ff..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png b/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
deleted file mode 100644
index 336a7a5b4e..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png b/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
deleted file mode 100644
index 5d97902f87..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 9908141e11..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 220e85e57c..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png b/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
deleted file mode 100644
index 79801b0471..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
deleted file mode 100644
index 07618e28aa..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
deleted file mode 100644
index f66994bcd2..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
deleted file mode 100644
index 1249814be6..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
deleted file mode 100644
index 0bb400b3dc..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
deleted file mode 100644
index e40c597ceb..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
deleted file mode 100644
index 2ddabd3331..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
deleted file mode 100644
index 617758a4b6..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
deleted file mode 100644
index a8ab0806e2..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
deleted file mode 100644
index d3f697ab1f..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
deleted file mode 100644
index 543b011c03..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
deleted file mode 100644
index d69e640fb3..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
deleted file mode 100644
index 48509772ce..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
deleted file mode 100644
index 93dc271b8e..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
deleted file mode 100644
index da2f1deb4a..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
deleted file mode 100644
index 4a7a5b4a3f..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
deleted file mode 100644
index fdf64c2958..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
deleted file mode 100644
index d4110a3b06..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
deleted file mode 100644
index 5622806282..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
deleted file mode 100644
index c0b5b0da4d..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
deleted file mode 100644
index 3c8b4c66d7..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
deleted file mode 100644
index 036adac6f3..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
deleted file mode 100644
index ea67c34b23..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
deleted file mode 100644
index 1727d6228a..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
deleted file mode 100644
index 8795c1dacc..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
deleted file mode 100644
index f711908135..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
deleted file mode 100644
index c69982d8e7..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
deleted file mode 100644
index 18eadf45ed..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
deleted file mode 100644
index 269de3edb1..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
deleted file mode 100644
index 198701e1bb..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
deleted file mode 100644
index 9f050cc629..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
deleted file mode 100644
index 4969508f31..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
deleted file mode 100644
index c73f1f5320..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
deleted file mode 100644
index f9a450ae2d..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
deleted file mode 100644
index 91bcf79e1f..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
deleted file mode 100644
index 4b8c71a8ae..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
deleted file mode 100644
index 91bcf79e1f..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png b/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
deleted file mode 100644
index 8f49c6b2f3..0000000000
--- a/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/Agarose.png b/src/main/resources/assets/bartworks/textures/items/Agarose.png
deleted file mode 100644
index fe6add0bb0..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/Agarose.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png b/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
deleted file mode 100644
index ea113e3f22..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png b/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
deleted file mode 100644
index 029d895f31..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png b/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
deleted file mode 100644
index 6b7f9a54d8..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BWmotor.png b/src/main/resources/assets/bartworks/textures/items/BWmotor.png
deleted file mode 100644
index c701227af2..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BWmotor.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BWrawtube.png b/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
deleted file mode 100644
index ab3dd4a2bd..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png b/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
deleted file mode 100644
index 73abda00dd..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png b/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
deleted file mode 100644
index eb5e37eaa1..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png b/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
deleted file mode 100644
index 5021c2834e..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png b/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
deleted file mode 100644
index a420873554..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png b/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
deleted file mode 100644
index 99dc1c9b95..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png b/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
deleted file mode 100644
index 7c10790535..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png b/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
deleted file mode 100644
index 92fe5e9d81..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT2Coin.png b/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
deleted file mode 100644
index c590469aed..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png b/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
deleted file mode 100644
index b04bb30f5c..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png b/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
deleted file mode 100644
index fd8185056b..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
deleted file mode 100644
index 18ab91de32..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
deleted file mode 100644
index 26f20f97f1..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
deleted file mode 100644
index 53c59ec79c..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
deleted file mode 100644
index 714b4806dd..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
deleted file mode 100644
index 2be7586764..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
deleted file mode 100644
index 6f95ff5256..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
deleted file mode 100644
index e29d9dc953..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
deleted file mode 100644
index 1e0c684eb1..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
deleted file mode 100644
index 1cbc98794d..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
deleted file mode 100644
index 7858c997d4..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
deleted file mode 100644
index 19b94a07cb..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
deleted file mode 100644
index 324df7101b..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
deleted file mode 100644
index 28432d2d9b..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
deleted file mode 100644
index ada36141c6..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
deleted file mode 100644
index 7054c76741..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
deleted file mode 100644
index b3b36e3bdc..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
deleted file mode 100644
index ab142635c9..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
deleted file mode 100644
index e7ac40c10f..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
deleted file mode 100644
index ea22c17f5c..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
deleted file mode 100644
index b2c8003b5c..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
deleted file mode 100644
index 0d026c2492..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/IncubationModule.png b/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
deleted file mode 100644
index e0ea17749d..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png b/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
deleted file mode 100644
index c0e5b9a822..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png b/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
deleted file mode 100644
index f51730a7af..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png b/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
deleted file mode 100644
index 0e62fa2621..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png b/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
deleted file mode 100644
index 9c20f554e7..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png b/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
deleted file mode 100644
index 26109fc979..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png b/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
deleted file mode 100644
index 0aea0500cf..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png b/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
deleted file mode 100644
index 6b2835d100..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TransformationModule.png b/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
deleted file mode 100644
index 36b8a44f4d..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png b/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
deleted file mode 100644
index f6d80e292e..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png b/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
deleted file mode 100644
index a02ee7ad6a..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png b/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
deleted file mode 100644
index 33b1e96bda..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/grindstone_top.png b/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
deleted file mode 100644
index 0be37504b5..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png b/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
deleted file mode 100644
index 6de5748e32..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/petriDish.png b/src/main/resources/assets/bartworks/textures/items/petriDish.png
deleted file mode 100644
index 467a79f19c..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/petriDish.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
deleted file mode 100644
index bdb4aafc04..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
deleted file mode 100644
index 13ae5461e8..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
deleted file mode 100644
index a11f72b76d..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
deleted file mode 100644
index 56863186ac..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
deleted file mode 100644
index a5bb68bb43..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
deleted file mode 100644
index 824697ab3d..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
deleted file mode 100644
index c00616ed74..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
deleted file mode 100644
index 3171928a82..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
deleted file mode 100644
index 4d0b74c047..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
deleted file mode 100644
index e60e68040f..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
deleted file mode 100644
index 5cea540797..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
deleted file mode 100644
index 24c6cb0573..0000000000
--- a/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
deleted file mode 100644
index 18e7cd3b3c..0000000000
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
deleted file mode 100644
index 85b66ad2a5..0000000000
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
deleted file mode 100644
index 745d1131c3..0000000000
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
deleted file mode 100644
index d966674e54..0000000000
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
+++ /dev/null
Binary files differ
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
+++ /dev/null
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/materialicons/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
deleted file mode 100644
index 47a39e7526..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat b/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat
deleted file mode 100644
index 9713953aac..0000000000
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat
+++ /dev/null
@@ -1 +0,0 @@
-for /r /d %%I in (*) do xcopy %1 "%%~fsI" /H /K /Y \ No newline at end of file
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.Core_Reactor_Cell.png b/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png
deleted file mode 100644
index e372f01092..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
deleted file mode 100644
index b0836b8d41..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
+++ /dev/null
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.Double_Tiberiumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
deleted file mode 100644
index bfe6e2288b..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
deleted file mode 100644
index a7d2c341a2..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
+++ /dev/null
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.Quad_Tiberiumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
deleted file mode 100644
index 85aa8c19a1..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
deleted file mode 100644
index 0a71854e05..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
+++ /dev/null
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.Tiberiumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
deleted file mode 100644
index 4071c6062d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
deleted file mode 100644
index bafc8a4c8c..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
+++ /dev/null
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.bwMetaGeneratedItem0/0.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png
deleted file mode 100644
index e16102588a..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
deleted file mode 100644
index 491164695b..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
deleted file mode 100644
index 38429ed78d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
deleted file mode 100644
index 3901815927..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
deleted file mode 100644
index c97ec3384c..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
deleted file mode 100644
index 40e5c92817..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
deleted file mode 100644
index 10c6f20de0..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
deleted file mode 100644
index 968e0745c9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
deleted file mode 100644
index 9e22dd6726..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
deleted file mode 100644
index 86411e18bd..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
deleted file mode 100644
index 57a7c7a932..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
deleted file mode 100644
index 9f68371247..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
deleted file mode 100644
index 7a322b76c0..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
deleted file mode 100644
index 9fe039db81..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
deleted file mode 100644
index 457a51b7a1..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
+++ /dev/null
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/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
deleted file mode 100644
index cd6a50eca3..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
deleted file mode 100644
index 5fea5be598..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
deleted file mode 100644
index 2b0422489e..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
+++ /dev/null
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/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
deleted file mode 100644
index 9e388650d9..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
deleted file mode 100644
index 3e9106f277..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
deleted file mode 100644
index b2bd85bf44..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
deleted file mode 100644
index 7c6797718d..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
+++ /dev/null
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/items/materialicons/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
deleted file mode 100644
index dbf735f4fb..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
deleted file mode 100644
index 66bd26dc46..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat b/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat
deleted file mode 100644
index 9713953aac..0000000000
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat
+++ /dev/null
@@ -1 +0,0 @@
-for /r /d %%I in (*) do xcopy %1 "%%~fsI" /H /K /Y \ No newline at end of file
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"
+ ]
+ }
+]